2013-07-28 146 views
-1

我在C#中有一個列表對象列表對象。我想用LINQ的'indall'方法搜索這個列表。在C#中的列表對象列表中搜索#

這裏是我使用的代碼:

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

不過,我不能夠搜索嵌套列表。 「用戶數據」的成員之一是「客戶信息」,它本身就是一個字符串列表。

任何想法如何做到這一點?

感謝

回答

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

第一,而不是重複相同的代碼很多次,我想創建擴展方法

現在使用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));