2013-03-12 64 views
0

由于某种原因,我无法完全理解这一项。查找包含列表中任何一个字符串的任何实体

说我们有一个类Foo

public class Foo 
{ 
    public string Name {get;set;} 
} 

而且我们有他们的泛型列表。我想搜索通用列表并挑选那些包含任何字符串列表的Name

因此,像

var source = GetListOfFoos();//assume a collection of Foo objects 
var keywords = GetListOfKeyWords();//assume list/array of strings 
var temp = new List<Foo>(); 
foreach(var keyword in keywords) 
{ 
    temp.AddRange(source.Where(x => x.Name.Contains(keyword)); 
} 

这里有:a)环(不觉得最佳的我)和b)每个对象可能会出现一次以上(如果名字是“罗布StackOverflow的”本次发行并且有一个关键字'Rob'和关键字'Stackoverflow')。

我想我可以打电话给Distinct()但是它再次感觉不到最佳。

我想我正在接近这个错误 - 我做错了什么?


+0

如此简单 - 有时你只需要有人指出这个非常明显的 – glosrob 2013-03-12 20:04:37

回答

2

我想通过通用的搜索列表,挑选出那些有 包含从字符串列表中的任何一个名称。

听起来相当简单:

var query = source.Where(e => keywords.Any(k => e.Name.Contains(k))); 

添加ToList(),得到的结果为List<Foo>

var temp = query.ToList(); 
1

把关键字转化为快速查找一个HashSet,所以你没有做一个N 循环。

HashSet<string> keywords = new HashSet<string>(GetListOfKeyWords(), StringComparer.InvariantCultureIgnoreCase); 

var query = source.Where(x => keywords.Contains(x.Name)); 

编辑:其实,我重新读了这个问题,是错的。这只会匹配整个关键字,而不会查看名称是否包含关键字。更好地解决问题。

我喜欢MarcinJuraszek的答案,但我也想你想要的关键字区分大小写的匹配,所以我想尝试这样的事:

var query = source.Where(f => keywords.Any(k => f.Name.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0)); 
+0

好的调用,因为关键字集合正在构建一次,然后重复访问。 – 2013-03-12 20:17:28

+0

嗯。你没有看错问题,它已被编辑。原始版本仅将名称与关键字匹配。 :S – 2013-03-12 20:18:12

相关问题