はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】LINQのAggregateメソッドについてまとめてみる

はじめに

今回は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

ではまた。