イテレーターメソッドでは、主に2種類の仕事をする。1つは一連の要素の繰り返しで、もう1つはそれぞれの要素に基づく処理(集計等)である。これらは別々のイテレーターメソッドで扱うべきである。
これらの仕事を行うには、デリゲートを使うのがよい。デリゲートの中でも、特に汎用的なものはAction<T>
、Func<T, TResult>
、Predicate<T>
として定義されている。
Predicate<T>
はbooleanを返す。フィルタリング処理等に使用する。以下はfilterFuncで絞り込みを行うWhere
メソッドの実装例。
public static IEnumerable<T> Where<T>
(IEnumerable<T> sequence,
Predicate<T> filterFunc)
{
// nullチェックは省略
foreach (var item in sequence)
if (filterFunc(item))
yield return item;
}
Func<T, TResult>
の実装例は以下。
public static IEnumerable<Tout> Select<Tin, Tout>(
IEnumerable<Tin> sequence, Func<Tin, Tout> method)
{
// nullチェックは省略
foreach (var element in sequence)
yield return method(element);
}