在C#中的列表对象列表中搜索

本文关键字:列表 对象 搜索 | 更新日期: 2023-09-27 18:25:09

我在C#中有一个List of List对象。我想使用LINQ的"findall"方法搜索此列表。

这是我正在使用的代码:

String searchString = "Keyword";
List<IntVector> newList = UserData.FindAll(s =>
                            s.ClientName.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            s.CustomerID.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            s.AddInfo.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0 ||
                            s.MobileNo.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0).ToList();

但是,我无法搜索嵌套列表。"UserData"的成员之一是"CustomerInfo",它本身就是一个字符串列表。

知道怎么做吗?

感谢

在C#中的列表对象列表中搜索

首先,我将创建扩展方法,而不是多次重复相同的代码

public static bool IgnoreCaseContains(this string s, string value)
{
    return s.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
}

现在使用WhereAny运算符:

var query = from u in UserData
            where u.ClientName.IgnoreCaseContains(searchString) ||
                  u.CustomerID.IgnoreCaseContains(searchString) ||
                  u.AddInfo.IgnoreCaseContains(searchString) ||
                  u.MobileNo.IgnoreCaseContains(searchString) || 
                  u.CustomerInfo.Any(i => i.IgnoreCaseContains(searchString))
            select u;

BTW FindAll返回列表,所以您不需要使用ToList调用来创建该列表的副本。


更进一步,您可以将所有这些复杂的搜索转移到用户搜索规范中,甚至转移到另一种扩展方法中:

public static bool Matches(this IntVector user, string searchString)
{
    return user.ClientName.IgnoreCaseContains(searchString) ||
           user.CustomerID.IgnoreCaseContains(searchString) ||
           user.AddInfo.IgnoreCaseContains(searchString) ||
           user.MobileNo.IgnoreCaseContains(searchString) ||
           user.CustomerInfo.Any(i => i.IgnoreCaseContains(searchString))
}

在这种情况下,您的代码将看起来像

List<IntVector> newList = UserData.FindAll(u => u.Matches(searchString));

var spec = new UserSearchSpecification("keyword");
List<IntVector> newList = UserData.FindAll(u => spec.IsSatisfiedBy(u));

您可以使用Any()扩展方法来查看字符串列表中的任何字符串是否与您的关键字-匹配

 List<IntVector> newList = UserData.FindAll(s =>
                           s.ClientName.IndexOf(searchString, 
                                  StringComparison.OrdinalIgnoreCase) >= 0 ||
                           s.CustomerID.IndexOf(searchString, 
                                  StringComparison.OrdinalIgnoreCase) >= 0 ||
                           s.AddInfo.IndexOf(searchString,
                                  StringComparison.OrdinalIgnoreCase) >= 0 ||
                           s.MobileNo.IndexOf(searchString, 
                              StringComparison.OrdinalIgnoreCase) >= 0 ||
                           s.CustomerInfo.Any(t => t.IndexOf(searchString, 
                             StringComparison.OrdinalIgnoreCase)) >= 0);