C#
LINQ
.NETFramework

Linq の Aggregate メソッドのオーバーロードごとの挙動まとめ

はじめに

System.Linq.Enumerable クラスの Aggregate メソッドで、どの呼び出し型を使用したらよいか迷ったとき、つぎの表で解決できると幸いです。Linq を便利に使いたい!

挙動

呼び出し型 列挙元の要素の型 初期値の型 処理Funcで列挙される型 結果の型
Enumerable.Aggregate
<TSource>
TSource TSource
列挙元の先頭要素
TSource
列挙元の要素の2つ目から
TSource
Enumerable.Aggregate
<TSource, TAccumulate>
TSource TAccumulate TSource
列挙元すべて
TAccumulate
Enumerable.Aggregate
<TSource, TAccumulate, TResult>
TSource TAccumulate TSource
列挙元すべて
TResult

引数指定

■ 処理Func (func) :
Func < 処理前の蓄積(最初は初期値)(TAccumulateかTSource), 列挙された要素(TSource), 処理結果とする蓄積(TAccumulateかTSource) >

ラムダ式
(処理前の蓄積, 列挙されてきた列挙元の要素) => { return 処理結果とする蓄積; }

■ 結果変換処理Func (resultSelector) :
Func < 蓄積(TAccumulate), 結果(TResult) >

ラムダ式
(蓄積) => { return 結果; }

どの呼び出し型にするか悩む原因?の考察

基本的には「初期値 -> 列挙元全要素を要素ごとに処理 -> 結果」となる処理ですが、Enumerable.Aggregate<TSource> だけは、列挙元の要素のうち最初のひとつが初期値とされ、2個目の要素から処理Funcが呼び出される(要素がひとつだけなら、そのひとつの要素がそのままが返される)点で他と異なることが、(私にとっては)理解しづらかった原因かも。。