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) 每个对象可能出现多次(如果名称是“Rob StackOverflow”并且有关键字“Rob”和关键字“Stackoverflow”) .

我想我可以打电话Distinct(),但又一次,感觉不是最理想的。

我认为我错误地处理了这个问题 - 我做错了什么?


4

2 回答 2

2

我想搜索通用列表并从字符串列表中挑选出名称包含任何名称的列表。

听起来很简单:

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

添加ToList()以获取结果为List<Foo>

var temp = query.ToList();
于 2013-03-12T19:57:23.593 回答
1

将关键字放入 HashSet 以进行快速查找,这样您就不会进行 N 2循环。

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));
于 2013-03-12T20:13:50.767 回答