はじめに
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が呼び出される(要素がひとつだけなら、そのひとつの要素がそのままが返される)点で他と異なることが、(私にとっては)理解しづらかった原因かも。。