Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Enumerable.Aggregate()

Enumerable.Aggregate()

シーケンスを左から順に累積処理して 1 つの値にまとめる LINQ の拡張メソッドです。他の言語の『reduce』に相当します。

構文
using System.Linq;

// シーケンスを累積処理します(初期値なし・先頭要素が初期アキュムレーター)。
T result = source.Aggregate((acc, x) => 累積式);

// 初期値を指定して累積処理します。
TAccumulate result = source.Aggregate(初期値, (acc, x) => 累積式);

// 累積後に結果を変換します。
TResult result = source.Aggregate(初期値, (acc, x) => 累積式, acc => 変換式);
メソッド一覧
シグネチャ概要
Aggregate(func)初期値なし。先頭要素をアキュムレーターとして累積します。空のシーケンスは例外を投げます。
Aggregate(seed, func)初期値(seed)を指定して累積します。空のシーケンスでも安全です。
Aggregate(seed, func, resultSelector)累積後にアキュムレーターを変換して返します。
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// すべての要素の積(1×2×3×4×5)を求めます。
int product = numbers.Aggregate((acc, n) => acc * n);
Console.WriteLine(product); // 120

// 初期値を指定して合計を求めます(Sum と同等)。
int sum = numbers.Aggregate(0, (acc, n) => acc + n);
Console.WriteLine(sum); // 15

// 文字列を連結します(初期値あり)。
List<string> words = new List<string> { "Hello", "World", "LINQ" };
string joined = words.Aggregate("", (acc, w) => acc == "" ? w : acc + ", " + w);
Console.WriteLine(joined); // Hello, World, LINQ

// 最大値を Aggregate で求めます(実際は Max() を使うのが普通)。
int max = numbers.Aggregate((acc, n) => acc > n ? acc : n);
Console.WriteLine(max); // 5

// 累積結果を変換するオーバーロード: 合計を求めて文字列に変換します。
string result = numbers.Aggregate(
    0,
    (acc, n) => acc + n,
    acc => $"合計は {acc} です"
);
Console.WriteLine(result); // 合計は 15 です

// 文字列リストの全文字数を数えます。
int totalLen = words.Aggregate(0, (acc, w) => acc + w.Length);
Console.WriteLine(totalLen); // 14
概要

『Aggregate()』は汎用的な累積処理メソッドです。合計や最大値など特定の集計は専用の『Sum()』『Max()』を使う方が可読性が高いですが、複雑なカスタム集計では『Aggregate()』が力を発揮します。

初期値なしの『Aggregate()』はシーケンスが空の場合に『InvalidOperationException』を投げます。空の可能性がある場合は必ず初期値(seed)を指定したオーバーロードを使ってください。

合計・平均・件数といった一般的な集計は専用メソッドの方が効率的です。詳細は『Enumerable.Count() / Sum() / Average()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。