我有一个自定义对象列表" CustomFile" - 这些包含各种数据以及"标题"字符串参数。列表本身称为" AllFiles"。
我正在显示" AllFiles"列表框中的用户列表(用户只能看到"标题"每个" CustomFile"对象的字符串)。
我还有一个搜索框,用户可以在其中输入搜索字符串。然后,他应该显示在"标题"上过滤的文件列表。参数。
一个例子" AllFiles"列表看起来像这样:
我使用了一个LINQ查询来选择所有" CustomFiles"在哪里"标题"包含搜索查询。
因此,如果用户搜索"文档",他会看到第1,3和5项。但是如果他搜索" ms文档"他不会得到任何结果,因为" AllFiles" for" ms documentation"。
现在我想让搜索更加灵活。在搜索" ms文档"时,用户应该看到第1项和第3项。同样,如果用户搜索" google chrome"他应该看到第5和第6项,即使6不包含确切的文字" google chrome"。
基本上我需要搜索" AllFiles"对象列表"标题"包含搜索查询中的所有单词,无论单词的顺序如何。
因此,我将搜索查询拆分为字符串列表(listSearchWords)。如果用户搜索"谷歌浏览器",我有一个列表,其中包含条目[1]" google"和[2]" chrome"。但是现在我陷入了下一步的困境。
文件和搜索查询中的单词数量当然是动态的,因此我不能只执行"包含项目1或包含项目2"。我需要以某种方式过滤" AllWords"对象列表" title"包含listSearchWords中的所有字符串。
感谢您的帮助。
修改
通过接受的答案,我把它归结为两行:
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.
答案 0 :(得分:3)
您可以使用LINQ使用您的标记化搜索词列表来查询查询。像这样:
searchItems.Where(a => searchTerms.All(a.Contains))
这有效地遍历所有搜索项,并返回搜索项包含每个搜索项的项。
以上是区分大小写的,如果您希望它不区分大小写,则必须尝试这样的操作:
searchItems.Where(a => searchTerms.All(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0));
修改强>
这是一个完整的工作示例:
namespace ConsoleApplication7
{
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var searchItems = new List<string> { "MS Excel documentation", "MS Excel tutorial", "MS Access documentation", "MS Access tutorial", "Google Chrome documentation", "Google Product video for Chrome" };
var searchTerms = new List<string> { "google", "chrome" };
var searchResults = searchItems.Where(a => searchTerms.All(b => a.IndexOf(b, StringComparison.OrdinalIgnoreCase) >= 0)).ToList();
foreach (var searchResult in searchResults)
{
Console.WriteLine(searchResult);
}
Console.ReadLine();
}
}
}
答案 1 :(得分:0)
您可以根据需要修改示例代码。
List<string> a = new List<string>();
a.Add("[1] MS Excel documentation");
a.Add("[2] MS Excel tutorial");
a.Add("[3] MS Access documentation");
a.Add("[4] MS Access tutorial");
a.Add("[5] Google Chrome documentation");
a.Add("[6] Google Product video for Chrome");
var result = from item in a
let x = "MS"
let y = "documentation"
where item.Contains(x) && item.Contains(y)
select item;
foreach (var item in result)
{
Console.WriteLine(item);
}
答案 2 :(得分:0)
如果你写一个扩展方法。它可以实现目标。
class Program
{
static void Main()
{
List<string> a = new List<string>();
a.Add("[1] MS Excel documentation");
a.Add("[2] MS Excel tutorial");
a.Add("[3] MS Access documentation");
a.Add("[4] MS Access tutorial");
a.Add("[5] Google Chrome documentation");
a.Add("[6] Google Product video for Chrome");
string search = "MS documentation";
var result = a.WhereExtension(search);
foreach (var item in result)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
}
public static class MyExtensions
{
public static List<string> WhereExtension(this List<string> source, string items)
{
var search = items.Split(' ');
List<string> list = new List<string>();
foreach (string item in source)
{
bool add = true;
for (int i = 0; i < search.Count(); i++)
{
if (!item.Contains(search[i]))
add = false;
}
if (add == true)
list.Add(item);
}
return list;
}
}