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 が "ささげ" です。例はちょっとミスってて、区切りのスラッシュが一個余分な感じです。