获取列表中的所有对象,其中字符串参数包含第二个列表中的所有字符串

时间:2015-03-19 23:17:36

标签: c# linq

我有一个自定义对象列表" CustomFile" - 这些包含各种数据以及"标题"字符串参数。列表本身称为" AllFiles"。

我正在显示" AllFiles"列表框中的用户列表(用户只能看到"标题"每个" CustomFile"对象的字符串)。

我还有一个搜索框,用户可以在其中输入搜索字符串。然后,他应该显示在"标题"上过滤的文件列表。参数。

一个例子" AllFiles"列表看起来像这样:

  • [1] MS Excel文档
  • [2] MS Excel教程
  • [3] MS Access文档
  • [4] MS Access教程
  • [5] Google Chrome文档
  • [6]适用于Chrome的Google产品视频

我使用了一个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.

3 个答案:

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