これはつまらないように聞こえるかもしれませんが、 の本当に良い説明を見つけることができませんでしたAggregate
。
良いというのは、短く、説明的で、小さくて明確な例を伴い包括的であることを意味します。
ベストアンサー1
の最もわかりやすい定義は、Aggregate
以前に行われた操作を考慮して、リストの各要素に対して操作を実行することです。つまり、最初の要素と 2 番目の要素に対してアクションを実行し、その結果を繰り越します。次に、前の結果と 3 番目の要素に対して操作を実行し、繰り越します。などです。
例 1. 数値の合計
var nums = new[]{1,2,3,4};
var sum = nums.Aggregate( (a,b) => a + b);
Console.WriteLine(sum); // output: 10 (1+2+3+4)
これは1
、 と を加算して2
を作成します3
。次に、3
(前の結果) と3
(シーケンス内の次の要素) を加算して を作成します6
。次に、6
と を加算し4
て を作成します10
。
例2. 文字列の配列からCSVを作成する
var chars = new []{"a","b","c","d"};
var csv = chars.Aggregate( (a,b) => a + ',' + b);
Console.WriteLine(csv); // Output a,b,c,d
これもほぼ同じように動作します。a
カンマとを連結して . を作成b
し、a,b
次に と を連結してa,b
. をc
作成しa,b,c
、これを繰り返します。
例3. シード値を使用して数を掛ける
完全を期すために、過負荷Aggregate
シード値を取得します。
var multipliers = new []{10,20,30,40};
var multiplied = multipliers.Aggregate(5, (a,b) => a * b);
Console.WriteLine(multiplied); //Output 1200000 ((((5*10)*20)*30)*40)
上記の例と同様に、これは の値から始まり5
、それをシーケンスの最初の要素に掛けて という10
結果を生成します50
。この結果は繰り越され、シーケンスの次の数値に掛けて20
という結果を生成します1000
。これはシーケンスの残りの 2 つの要素まで続きます。
実際の例:http://rextester.com/ZXZ64749
ドキュメント:http://msdn.microsoft.com/en-us/library/bb548651.aspx
補遺
上記の例 2 では、文字列の連結を使用して、コンマで区切られた値のリストを作成しています。これは、Aggregate
この回答の意図である の使用を説明する最も単純な方法です。ただし、この手法を使用して大量のコンマ区切りデータを実際に作成する場合は、 を使用する方が適切でありStringBuilder
、これは、Aggregate
seeded オーバーロードを使用して を開始することと完全に互換性がありますStringBuilder
。
var chars = new []{"a","b","c", "d"};
var csv = chars.Aggregate(new StringBuilder(), (a,b) => {
if(a.Length>0)
a.Append(",");
a.Append(b);
return a;
});
Console.WriteLine(csv);