Arrayクラスには、述語(Predicate)を使った要素の検索や取得を行うメソッドがいくつか用意されています。 デリゲートとして条件を記述したものをこれらのメソッドに渡すことによって、その条件に見合う要素を検索・取得することが出来ます。

これらのメソッドを使うことにより、for文・foreach文で列挙してif文で各要素を条件と照らし合わせて検索するといった処理を、メソッドを呼び出すだけで済ませる事が出来るようになります。 言い換えるとfor文・foreach文による配列要素に対する繰り返し処理から、if文等による条件分岐等の処理をメソッド/デリゲートとして分離することができます。

Arrayクラスには、述語を使った要素の検索・取得を行うことが出来るメソッドとして次のようなものが用意されています。

述語を使った要素の検索・取得を行うメソッド
メソッド 機能
Find 述語で定義された条件と一致する最初の要素を取得する
FindLast 述語で定義された条件と一致する最後の要素を取得する
FindAll 述語で定義された条件と一致するすべての要素を取得する
FindIndex 述語で定義された条件と一致する最初の要素のインデックスを取得する
FindLastIndex 述語で定義された条件と一致する最後の要素のインデックスを取得する
Exists 述語で定義された条件と一致する要素があるかどうかを判断する
TrueForAll 述語で定義された条件とすべての要素が合致するかどうかを判断する

次の例では、値が偶数かどうかを返すメソッドを作成し、それを述語として使用することで配列内にある偶数の要素を検索・取得しています。

述語を使って配列内の要素を検索する
using System;

class Sample {
  // 引数で与えられた数が偶数かどうか
  static bool IsEven(int val)
  {
    if (val % 2 == 0)
      return true;
    else
      return false;
  }

  static void Main()
  {
    int[] arr = {1, 4, 3, 5, 2, 6};

    // 「値が偶数かどうか」という述語となるデリゲート
    Predicate<int> isEven = IsEven;

    // 値が偶数の要素とそのインデックスを取得
    Console.WriteLine("Find: {0}", Array.Find(arr, isEven));
    Console.WriteLine("FindIndex: {0}", Array.FindIndex(arr, isEven));
    Console.WriteLine("FindLast: {0}", Array.FindLast(arr, isEven));
    Console.WriteLine("FindLastIndex: {0}", Array.FindLastIndex(arr, isEven));

    // 値が偶数の要素をすべて取得
    Console.Write("FindAll: ");

    foreach (var elem in Array.FindAll(arr, isEven)) {
      Console.Write("{0}, ", elem);
    }

    Console.WriteLine();

    // 値が偶数の要素が存在するかどうか
    Console.WriteLine("Exists? {0}", Array.Exists(arr, isEven));

    // すべての要素の値が偶数かどうか
    Console.WriteLine("TrueForAll? {0}", Array.TrueForAll(arr, isEven));
  }
}
実行結果
Find: 4
FindIndex: 1
FindLast: 6
FindLastIndex: 5
FindAll: 4, 2, 6, 
Exists? True
TrueForAll? False