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

时间:2013-07-28 08:47:26

标签: c# string linq list

我在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'的成员之一是'CustomerProfo',它本身就是String的列表。

知道该怎么做吗?

由于

2 个答案:

答案 0 :(得分: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;

BTW FindAll返回列表,因此您无需通过ToList调用创建该列表的副本。


更进一步,您可以将所有这些复杂的搜索移动到user search specification,甚至是另一种扩展方法:

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));

答案 1 :(得分: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);