C# 从列表中查找包含任意一个字符串的任何实体

C# 从列表中查找包含任意一个字符串的任何实体,c#,linq,generics,C#,Linq,Generics,由于某种原因,我不能完全理解这一点 假设我们有一个类Foo public class Foo { public string Name {get;set;} } 我们有一个通用的清单。我想在通用列表中搜索,并从字符串列表中选择那些具有名称且包含任何字符串的列表 大概是 var source = GetListOfFoos();//assume a collection of Foo objects var keywords = GetListOfKeyWords();//assume

由于某种原因,我不能完全理解这一点

假设我们有一个类
Foo

public class Foo
{
    public string Name {get;set;}
}
我们有一个通用的清单。我想在通用列表中搜索,并从字符串列表中选择那些具有
名称
且包含任何字符串的列表

大概是

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));
}
var source=getlistofoos()//假设一个Foo对象的集合
var keywords=GetListOfKeyWords()//假设字符串的列表/数组
var temp=新列表();
foreach(关键字中的var关键字)
{
temp.AddRange(source.Where(x=>x.Name.Contains(关键字));
}
这里的问题是a)循环(我觉得不是最优的)和b)每个对象可能出现不止一次(如果名称为“Rob StackOverflow”,并且有一个关键字“Rob”和关键字“StackOverflow”)

我想我可以调用
Distinct()
,但同样,它感觉不到最佳效果

我想我的做法不对——我做错了什么


我想在通用列表中搜索,找出那些 包含字符串列表中任何字符串的名称

听起来很简单:

var query = source.Where(e => keywords.Any(k => e.Name.Contains(k)));
添加
ToList()
以将结果作为
列表

我想在通用列表中搜索,找出那些 包含字符串列表中任何字符串的名称

听起来很简单:

var query = source.Where(e => keywords.Any(k => e.Name.Contains(k)));
添加
ToList()
以将结果作为
列表


将关键字放入哈希集中进行快速查找,这样就不会进行N2循环


将关键字放入哈希集中进行快速查找,这样就不会进行N2循环


如此简单-有时你只需要有人指出非常明显的调用如此简单-有时你只需要有人指出非常明显的调用,因为关键字集合只构建一次,然后重复访问。嗯。你没有看错问题,它已经被编辑过了。原始版本刚刚将名称与关键字匹配:SGood调用,因为关键字集合只生成一次,然后重复访问。Hmm。你没有看错问题,它已经被编辑过了。原始版本刚刚将名称与关键字匹配:s
HashSet<string> keywords = new HashSet<string>(GetListOfKeyWords(), StringComparer.InvariantCultureIgnoreCase);

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