我在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的列表。
知道该怎么做吗?
由于
答案 0 :(得分:3)
首先,我不是多次重复相同的代码,而是创建扩展方法
public static bool IgnoreCaseContains(this string s, string value)
{
return s.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0;
}
现在使用Where
和Any
运营商:
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);