-1

我在 C# 中有一个 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”,它本身就是一个字符串列表。

知道怎么做吗?

谢谢

4

2 回答 2

3

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

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;

BTWFindAll返回列表,因此您无需通过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));
于 2013-07-28T09:41:18.877 回答
1

您可以使用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);
于 2013-07-28T08:54:05.603 回答