C#の配列やListを検索する (Find,FindAll,FindIndex)

配列Listクラスには格納された要素を検索する為のメソッドが用意されています。

ListクラスにはFindメソッドなどがあります。

配列の場合は Arrayクラスを利用します。Arrayクラスのメソッドは static になっており各メソッドの第1引数に配列を渡すようになっていますが、それ以外使い方はListクラスと同じです。

検索メソッドの種類

検索のためのメソッドは以下のようにいくつか用意されています。

 

Listクラス

  • Find(Predicate<T>)                    ・・・Listを先頭から検索して最初に一致する要素を返します
  • FindAll(Predicate<T>)                ・・・Listを検索して一致する要素すべてをListで返します
  • FindIndex(Predicate<T>)            ・・・Listを先頭から検索して最初に一致する要素のインデックス番号を返します
  • FindLast(Predicate<T>)              ・・・Listを最後から検索して最初に一致する要素を返します
  • FindLastIndex(Predicate<T>)      ・・・Listを最後から検索して最初に一致する要素のインデックス番号を返します

 

Arrayクラス

 

 

検索条件を定義するPredicate<T>デリゲート

検索条件は Predicate<T>デリゲートで定義します。

    public delegate bool Predicate<T>(T obj);

引数には Listの要素が渡されてきます。

この要素が検索条件を満たすなら戻り値に true を、そうでないなら false を返します。 

 

以下の例では、xとyが5以上の全てを抽出しています。

検索条件のデリゲートはラムダ式で実装しています。

    public class TestItem
    {
        public int x;
        public int y;
    }
private void Test()
{
    var list = new List<TestItem>();

    list.Add(new TestItem() { x = 5, y = 4 });
    list.Add(new TestItem() { x = 2, y = 1 });
    list.Add(new TestItem() { x = 4, y = 7 });
    list.Add(new TestItem() { x = 6, y = 3 });
    list.Add(new TestItem() { x = 9, y = 9 });
    list.Add(new TestItem() { x = 5, y = 6 });

    var match = list.FindAll(item =>
    {
        if (5 > item.x) return false;
        if (5 > item.y) return false;
        return true;
    });

    foreach (var item in match)
    {
        System.Console.WriteLine("X=" + item.x + ",Y=" + item.y);
    }
}

※デリゲートの詳細はC#のデリゲート (delegate) って何?をご覧ください

※ラムダ式の詳細はC#のラムダ式【=>】って何?をご覧ください

 

関連記事