【发布时间】:2015-03-21 19:14:25
【问题描述】:
我有一个自定义对象列表“CustomFile”——这些对象包含各种数据以及一个“title”字符串参数。该列表本身称为“AllFiles”。
我在列表框中向用户显示“AllFiles”列表(用户只能看到每个“CustomFile”对象的“title”字符串)。
我还有一个搜索框,用户可以在其中输入搜索字符串。然后应该向他显示根据“标题”参数过滤的文件列表。
“AllFiles”列表示例如下所示:
- [1] MS Excel 文档
- [2] MS Excel 教程
- [3] MS Access 文档
- [4] MS Access 教程
- [5] 谷歌浏览器文档
- [6] 适用于 Chrome 的 Google 产品视频
我使用了一个 LINQ 查询,它选择所有“自定义文件”,其中“标题”包含搜索查询。
因此,如果用户搜索“文档”,他会看到项目 1、3 和 5。但如果他搜索“ms 文档”,他将不会得到任何结果,因为在“AllFiles”中没有与“ms 文档”完全匹配”。
现在我想让搜索更加灵活一些。在搜索“ms 文档”时,用户应该看到项目 1 和 3。同样,如果用户搜索“google chrome”,他应该看到项目 5 和 6,即使 6 不包含确切的文本“google chrome”。
基本上,我需要在“所有文件”列表中搜索“标题”包含搜索查询中所有单词的对象,无论单词的顺序如何。
所以我将搜索查询拆分为字符串列表 (listSearchWords)。如果用户搜索“google chrome”,我有一个包含条目 [1]“google”和 [2]“chrome”的列表。但是现在我被困在下一步该怎么做。
文件和搜索查询中的单词数量当然是动态的,所以我不能只做“包含第 1 项或包含第 2 项”。我需要以某种方式过滤“标题”包含来自 listSearchWords 的所有字符串的对象的“AllWords”列表。
感谢您的帮助。
编辑
通过接受的答案,我把它归结为两行:
List<string> searchTerms = searchQuery.Text.Split(' ').ToList();
searchQuery 是用户输入的搜索词串。
var filteredObjects = AllObjects.Where
(a => searchTerms.All(b => a.[string parameter on object].IndexOf
(b, StringComparison.OrdinalIgnoreCase) >= 0)).ToList();
//AllObjects is a list of the custom objects.
//string parameter on object] is the string variable on the custom object that I'm filtering on.
【问题讨论】:
-
似乎 All 方法只是返回一个关于序列的所有元素是否满足特定条件的布尔值。我已经阅读并重新阅读了您链接的文章,但我不完全了解如何将其应用于我的问题。
-
您是否在控制台应用程序中尝试过示例代码? All 方法位于 Where 方法中。外部 Where 方法将选择搜索项中满足特定条件的每个项。条件是搜索项必须包含您已标记化的所有搜索词。如果我正确理解您的问题,我真的认为这是一个合适的解决方案。
-
是的,不过我在理解方面遇到了一些问题。当有很多嵌套命令时,Linq 语法会变得有点复杂。无论如何,由于下面的代码,我终于得到了它。非常感谢。