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));