[解決済み] LINQ集計アルゴリズム説明
質問
ダサいと思われるかも知れませんが、私は
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)
これは
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
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);
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】Nullableオブジェクトは値を持たなければならない?