< TODO: 依存関係プロパティ | 明示的に定義されたインターフェース プロパティへのバインディング >

February 12, 2009

Enumerable.Aggregate メソッドのオーバーロードを整理してみたい。

Enumerable.Aggregate メソッド には、オーバーロードが 3 つあって、使いどころが若干違うように思います。

public static TSource Aggregate<TSource>(
    this IEnumerable<TSource> source,
    Func<TSource, TSource, TSource> func
)

一番シンプルなやつ。

string[] beans = { "ささげ", "いんげん", "そらまめ", "えんどう", "だいず", };
Console.WriteLine (
    beans.Aggregate ((work, next) => work + "/" + next)
    );

ポイントは、func が実行される回数が、source.Count () - 1 回だということ。上の例では一発目は work が "ささげ"、next が "いんげん" となります。区切り文字を入れて文字列を連結したりするのにぴったり。

public static TAccumulate Aggregate<TSource, TAccumulate>(
    this IEnumerable<TSource> source,
    TAccumulate seed,
    Func<TAccumulate, TSource, TAccumulate> func
)

初期値のあるやつ。

string[] beans = { "ささげ", "いんげん", "そらまめ", "えんどう", "だいず", };
Console.WriteLine (
    beans.Aggregate (0, (work, next) => work += next.Length)
    );

func は source.Count () 回実行されます。例の一発目は work が 0、next が "ささげ" です。全要素に対して同様の評価を行う必要がある場合に向いてると思います。

public static TResult Aggregate<TSource, TAccumulate, TResult>(
    this IEnumerable<TSource> source,
    TAccumulate seed,
    Func<TAccumulate, TSource, TAccumulate> func,
    Func<TAccumulate, TResult> resultSelector
)

初期値があり、さらに結果に対してごにょごにょすることができるやつ。

string[] beans = { "ささげ", "いんげん", "そらまめ", "えんどう", "だいず", };
Console.WriteLine (
    beans.Aggregate (
        new StringBuilder (), (work, next) => work.AppendFormat ("/{0}類", next), builder => builder.ToString ())
    );

初期値のあるやつと同じで、func は source.Count () 回実行されます。例の一発目は work が StringBuilder ("")、next が "ささげ" です。例はちょっとミスってて、区切りのスラッシュが一個余分な感じです。

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2319

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?