はじめに
今回はLINQのAggregateメソッドについてまとめてみる記事になります!
Aggregate
とは日本語にすると「集計」というらしく、初見だと結構取っ付きづらそうな印象を受けます。
といっても一度理解してしまえばさほど難しいものではないので、是非これを気にマスターしてしまいましょう。
Aggregateメソッド
3つのオーバーロードで一番簡単な定義はこちら。
public static TSource Aggregate<TSource> (this IEnumerable<TSource> source, Func<TSource,TSource,TSource> func);
Enumerable.Aggregate メソッド (System.Linq) | Microsoft Docs
一番注目して欲しいのはfunc
の型ですね。
このFunc<TSource,TSource,TSource>
ということで、第一引数はひとつ前の要素の処理のときの返り値・第二引数は各要素を指します。返り値・引数は全部同じ型というわけですね。
※イメージ int func(int sum, int element) { // コレクションの合計値を求める例 return sum + element; }
実際に使用例をみながらみていきましょう。
使ってみる
Aggreagate
メソッドを使ったよくある例として、コレクションの合計値を求めてみましょう。
static void Main() { var numbers = Enumerable.Range(1, 10); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 int result = numbers.Aggregate((sum, element) => sum + element); Console.WriteLine(result); // 55 }
Aggregate
メソッドを使用すると、コレクションの各要素(1,2,3,...,10)に対してfunc
を一回呼び出し、集計された値(sum)と要素の値(element)の両方が渡されます。そしてfunc
の結果が前の集計値に置き換えられます。
初期値を設定する
上のやり方だと集計値の初期値は型のデフォルト値になります。int
型なら0ですね。
Aggregate
メソッドのオーバーロードの一つを用いることで初期値を設定することもできます。
public static TAccumulate Aggregate<TSource,TAccumulate> (this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> func);
このseed
という奴が初期値です。
また必ずしもコレクションの型(TSource)と初期値・返り値(TAccumulate)を一致させなくても良いというもの面白いところの一つですね。
static void Main() { var numbers = Enumerable.Range(1, 10); var result = numbers.Aggregate("number is ", (sum, element) => sum + element + " "); Console.WriteLine(result); // number is 1 2 3 4 5 6 7 8 9 10 }
さいごに
紹介していないオーバーロードをひとつありますが、そんなに使わない気もするので省略されていただきました。
ざっくり説明しておくと最後の結果を加工できるみたいな感じです。
気になる方は公式ドキュメントの一番上の奴をみてみてください。
docs.microsoft.com
ではまた。