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