8

我整天都在尝试解决这个问题,但还没有找到真正有效的解决方案。当我搜索一些数据时,我想根据多个单词过滤掉数据。

我的输入值是使用标准的 .Split 函数拆分的。

string[] searchstrings = MessageResult.Split(' ');

我做了一个查询(显然不能正常工作),试图过滤掉与搜索字符串中的每个字符串匹配的所有条目。

                    var suggestions = (from a in query
                               from w in searchstrings
                               where a.Message.ToLower().Contains(w.ToLower())
                               select a).Distinct();

查询是我的变量,它包含所有数据。我怎样才能使这个查询实际上只匹配包含搜索字符串中每个字符串的条目?

4

2 回答 2

19
var query = new string[]
{
    "abc foo bar xyz john doe",
    "abc foo bar xyz doe",
    "hello world",
    "abc foo bar john doe",
};

var searchstrings = new string[]
{
    "abc",
    "foo",
    "john",
    "xyz",
};

searchstrings = searchstrings.Select(x => x.ToLower()).ToArray();

var results = query.Select(x => x.ToLower())
                   .Where(x => searchstrings.All(y => x.Contains(y)));

注意:
ToLower()是在Where子句之外执行的,以节省对该方法的大量调用。

于 2012-07-19T12:38:13.057 回答
18

我认为下面的代码应该可以解决您的问题。它检查 searchstring 中的所有单词是否都在查询 (a) 中。

var suggestions = (from a in query
                   where searchstrings.All(word => a.ToLower().Contains(word.ToLower()))
                   select a);
于 2012-07-19T12:36:50.920 回答