Effective C# 3rd 読書メモ 32 イテレーションとAction/Predicate/Functionの間の結合度を低くする

イテレーターメソッドでは、主に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);
}

コメントを残す

コメントを残す