1. ホーム
  2. c#

[解決済み] LINQ集計アルゴリズム説明

2022-03-21 04:47:56

質問

ダサいと思われるかも知れませんが、私は Aggregate .

良いとは、短く、説明的で、包括的で、小さくて明確な例があることです。

どのように解決するのか?

の定義が最もわかりやすい。 Aggregate は、リストの各要素に対して、それ以前に行われた操作を考慮して操作を実行するというものです。つまり、1番目と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)

これは 12 を作成します。 3 . 次に 3 (前の結果)と 3 (シーケンス内の次の要素)を作成するために 6 . 次に 64 を作成します。 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
Docs http://msdn.microsoft.com/en-us/library/bb548651.aspx


追記

上の例2は、文字列の連結を利用して、カンマで区切られた値のリストを作成しています。の使い方を簡単に説明したものです。 Aggregate というのが、この回答の意図です。しかし、この手法を使って実際に大量のカンマ区切りデータを作成するのであれば、より適切なのは StringBuilder と完全に互換性があります。 Aggregate を開始するためにシードされたオーバーロードを使用します。 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