查找包含列表中任意字符串的任何实体

本文关键字:任何 实体 字符串 任意 包含 列表 查找 | 更新日期: 2023-09-27 18:03:39

不知道为什么我不太明白这一点。

假设我们有一个类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(),但再次,它只是不太理想。

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


查找包含列表中任意字符串的任何实体

我想在通用列表中搜索并挑选那些有包含字符串列表中任意一个的名称。

听起来很简单:

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

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

var temp = query.ToList();

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

HashSet<string> keywords = new HashSet<string>(GetListOfKeyWords(), StringComparer.InvariantCultureIgnoreCase);
var query = source.Where(x => keywords.Contains(x.Name));
编辑:实际上,我重读了这个问题,但我错了。这将只匹配整个关键字,而不查看Name是否包含关键字。

我喜欢MarcinJuraszek的答案,但我也会假设您希望关键字不区分大小写的匹配,所以我会尝试这样做:

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