我在C#中寻找LINQ表达式来搜索对象列表中的空格分隔句子。
我有一个包含这些项目的地方列表。
var places=new List<Places>();
var place1=new Place(){Name="facebook twitter", OtherName="fun time"}
places.Add(place1);
var place2=new Place(){Name="facebook microsoft", OtherName="fun programming"}
places.Add(place2);
var place3=new Place(){Name="Microsoft CMS", OtherName="fun CMS"}
places.Add(place3);
搜索查询=“脸书时间”或“时间脸书” 预期结果= place1
搜索查询=“微软乐趣”或“有趣的微软” 预期结果= place2和place3
搜索查询=“有趣的微程序”或“微笑程序” 预期结果= place2
我已经尝试过这段代码,但它没有返回任何结果。搜索查询中有一个空格分隔的单词。
var queryParts = query.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var filteredList = places.Where(x => queryParts.Any(y => x.Name.Contains(y, StringComparison.CurrentCultureIgnoreCase)) || queryParts.Any(y => x.OtherName.Contains(y, StringComparison.CurrentCultureIgnoreCase)))
注意:contains是一种扩展方法
public static bool Contains(this string source, string toCheck, StringComparison comp)
{
return source.IndexOf(toCheck, comp) >= 0;
}
答案 0 :(得分:1)
您可以在搜索字符串中包含的令牌上使用aggregate。此查询尝试匹配给定搜索字的所有。
var queryParts = query.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var filteredList =
queryParts.Aggregate(places, (current, token) =>
current.Where(p => p.Name.Contains(token, StringComparison.CurrentCultureIgnoreCase)
|| p.OtherName.Contains(token, StringComparison.CurrentCultureIgnoreCase))
);
答案 1 :(得分:0)
根据您的说明,我假设您要在列表中返回包含 ALL 查询中的字词的项目。如果是这种情况,您只需要像这样更改Where()
:
var filteredList = places.Where(
p => queryParts.All(
q => p.Name.Contains(q, StringComparison.OrdinalIgnoreCase)
|| p.OtherName.Contains(q, StringComparison.OrdinalIgnoreCase)));