-1

C# で List オブジェクトの 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」のメンバーの 1 つは「CustomerInfo」で、それ自体が文字列のリストです。

それを行う方法はありますか?

ありがとう

4

2 に答える 2

3

まず、同じコードを何度も繰り返す代わりに、拡張メソッドを作成します

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

WhereandAny演算子を使用します。

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));
于 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 に答える