2015-10-16 188 views
2

我有一个类如下:找到所有关键字

public class PropertyResult { 
    public Int32 Id { get; set; } 
    public String Keywords { get; set; } 
} 

我有这个类的一个列表和一个字符串:

List<PropertyResult> properties = externalAPI.GetProperties(); 

List<String> keywords = new List<String> { "A", "B", "C" } 

注意,属性的关键词是类似“A, B,C“。

我需要获取所有包含所有关键字的属性。我正在为:

properties = listing.Properties.All(x => keywords.Contains(x.Keywords)) 

问题是,x.Keywords在字符串中包含所有关键字。

+1

你可以改变'Keywords'是一个'List'而不是逗号分隔字符串? –

+0

不......这就像来自外部API那样。我无法控制它。 –

回答

2

您可以使用Where + All: -

var result = properties.Where(x => keywords.All(z => x.Keywords.Contains(z))); 

Fiddle.

+0

不幸的是,如果集合包含不同数量的字符,则这不起作用。使用我的测试(请参阅其他答案)如果“关键字”字符串包含“A,B,C,D”,它将返回。也许这没关系(OP的问题对是否允许超集有点不清楚)。 –

+0

@CraigW。 - 对我来说不行OP的问题很明显,因为他说**我需要获得所有包含所有关键字的属性。**因此,对于后者,他的意思是'列表关键字'反之亦然。 –

+0

是的,我也读过他的原文。您引用的声明,至少在撰写时,可以解释。我仍然认为不清楚是否允许精确集合匹配或超集(即集合[A,B,C]和[A,B,C,D] ==或!=)。鉴于他接受了你的回答,我期望他的目的应该被认为是==,但是如果有人试图在不允许超集的情况下实施你的解决方案,他们会得到不正确的结果。 –

-1

如果其中一个关键字与属性匹配,则要使用.Any来检查字符串数组并返回True

properties = listing.Properties.Where(x => keywords.Any(a => a[0] == x)).ToList(); 
+0

我很确定,甚至不会编译。上下文变量'x'属于'PropertyResult'类型,因此'a [0] == x'试图将'char'与'PropertyResult'进行比较。 –

2

请尝试以下操作。

List<PropertyResult> properties = new List<PropertyResult>(); 

List<String> keywords = new List<String> { "A", "B", "C" }; 

properties.Add(new PropertyResult() { Id = 1, Keywords = "A,B,C" }); 
properties.Add(new PropertyResult() { Id = 1, Keywords = "A,B,C,D" }); 
properties.Add(new PropertyResult() { Id = 1, Keywords = "B,C,D" }); 

var result = properties.Where(p => p.Keywords.Split(',').Except(keywords).Count() == 0); 

当我运行在LINQPad result上面是一个IEnumerable<PropertyResult>一次入境,包含 “A,B,C”(正如你所期望/希望)的PropertyResult

如果你不是LINQPad的粉丝,这里有一个.NET小提琴(https://dotnetfiddle.net/wKAJfb)。

0

您必须拆分关键字字符串,以便您拥有各个关键字,然后将该集合与您拥有的集合进行比较。我假设你不关心订单 - 具有关键字“B,A,C”的财产将匹配关键字列表“A,B,C”。

var keywords = new List<string>{"a","b","c"}; 
var matches = listing.Properties.Where(
     prop => new HashSet<string>(prop.Keywords.Split(',')) 
       .SetEquals(keywords)); 

我们在这里所做的是字符串分割关键字并将它们加载到一个HashSet,这是一组操作的高效数据结构。然后我们使用SetEquals方法来检查哈希集是否包含与关键字列表相同的元素。