LINQ在列表中搜索空格分隔值

时间:2017-11-23 08:06:18

标签: c# linq

我在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;
}

2 个答案:

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

.Net Fiddle

答案 1 :(得分:0)

根据您的说明,我假设您要在列表中返回包含 ALL 查询中的字词的项目。如果是这种情况,您只需要像这样更改Where()

var filteredList = places.Where(
    p => queryParts.All(
        q => p.Name.Contains(q, StringComparison.OrdinalIgnoreCase) 
             || p.OtherName.Contains(q, StringComparison.OrdinalIgnoreCase)));