LINQ 集計アルゴリズムの説明 質問する

LINQ 集計アルゴリズムの説明 質問する

これはつまらないように聞こえるかもしれませんが、 の本当に良い説明を見つけることができませんでした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、これは、Aggregateseeded オーバーロードを使用して を開始することと完全に互換性があります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);

更新された例:http://rextester.com/YZCVXV6464

おすすめ記事