MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
LINQ - 集計のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
LINQ - 集計
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == LINQの集計に関する拡張メソッドは、コレクション内の要素を効率的に処理して、単一の結果を得るために使用される。<br> <br> これらのメソッドは、データ分析やビジネスロジックの実装において有効である。<br> 例えば、売上データの分析や、ユーザーの行動パターンの把握などに活用できる。<br> <br> 実例としては、顧客の年齢データから最年少と最年長の顧客を特定して、平均年齢を計算するシナリオが考えられる。<br> このような場合、Minメソッド、Maxメソッド、Averageメソッドを組み合わせて効果的に情報を抽出することができる。<br> <br> Maxメソッドは、シーケンス内の最大値を返す。<br> 数値型だけでなく、比較可能な任意の型に対して使用できる。<br> 空のシーケンスに対して呼び出すと例外が発生するため、注意が必要である。<br> <br> Minメソッドは、シーケンス内の最小値を返す。<br> Maxメソッドと同様、様々な型に対して使用できる。<br> 空のシーケンスへの対応にも同じ注意が必要である。<br> <br> Averageメソッドは、数値シーケンスの平均値を計算する。<br> 整数型や浮動小数点型のシーケンスに対して使用する。<br> 結果は、常に浮動小数点型となる。<br> <br> Sumメソッドは、数値シーケンスの合計を計算する。<br> 整数型や浮動小数点型のシーケンスに対して使用する。<br> 大きな値の合計を計算する際はオーバーフローに注意が必要である。<br> <br> Countメソッドは、シーケンス内の要素数を返す。<br> 条件を指定して、特定の条件を満たす要素の数を数えることも可能である。<br> 大規模なコレクションでは、パフォーマンスに影響を与える可能性がある。<br> <br> Aggregateメソッドは、カスタム集計操作を実行する。<br> より複雑な集計ロジックを実装する場合に使用する。<br> 初期値とラムダ式を指定して、シーケンスの各要素に対して累積的に操作を適用する。<br> <br> パフォーマンスの観点からは、これらのメソッドは一般的に効率的であるが、大規模なデータセットを扱う場合には注意が必要である。<br> 特に、複数の集計操作を行う場合、可能な限り1度のイテレーションで処理するよう設計することが重要である。<br> <br><br> == 結果の表示 == ここでは、結果の表示において、独自の拡張メソッドToResult(this IEnumerable)を使用している。<br> <br> <syntaxhighlight lang="c#"> // 結果表示用の拡張メソッド public static String ToResult<TSource>(this IEnumerable<TSource> source) { return "{" + string.Join(", ", source) + "}"; } public static String ToResult<TKey, TSource>(this IEnumerable<IGrouping<TKey, TSource>> source) { return source.Select(group => string.Format("Key={0}, Source={1}", group.Key, group.ToResult())).ToResult(); } </syntaxhighlight> <br><br> == 集計 == <center> {| class="wikitable" | style="background-color:#fefefe;" |- ! style="background-color:#66CCFF;" | メソッド名 ! style="background-color:#66CCFF;" | 機能 |- | Max || 最大値を返す。 |- | Min || 最小値を返す。 |- | Average || 平均値を返す。 |- | Sum || 合計を返す。 |- | Count || 要素数を返す。 |- | Aggregate || アキュムレータ関数で処理した結果を返す。 |} </center> <syntaxhighlight lang="c#"> // 基本的な例 var source = new[] { 3, 4, 5, 6, 7, 8, 9, 9 }; Console.WriteLine(source.Max()); // -> 9 Console.WriteLine(source.Min()); // -> 3 Console.WriteLine(source.Average()); // -> 6.375 Console.WriteLine(source.Sum()); // -> 51 Console.WriteLine(source.Count()); // -> 8 Console.WriteLine(source.Aggregate((now, next) => now * next)); // -> 1632960 // 参考:標本分散 double ave = source.Average(); Console.WriteLine(source.Sum(e => Math.Pow(e - ave, 2)) / source.Count()); // -> 4.484375 // 応用例 List<Product> products = new List<Product> { new Product { Name = "Apple", Price = 0.5m, Stock = 100 }, new Product { Name = "Banana", Price = 0.3m, Stock = 150 }, new Product { Name = "Orange", Price = 0.6m, Stock = 80 }, new Product { Name = "Mango", Price = 1.2m, Stock = 30 } }; Console.WriteLine($"最も高価な商品: {products.Max(p => p.Price)}"); // -> 1.2 Console.WriteLine($"最も安価な商品: {products.Min(p => p.Price)}"); // -> 0.3 Console.WriteLine($"平均価格: {products.Average(p => p.Price):C}"); // -> 0.65 Console.WriteLine($"総在庫数: {products.Sum(p => p.Stock)}"); // -> 360 Console.WriteLine($"0.5ドル以上の商品数: {products.Count(p => p.Price >= 0.5m)}"); // -> 3 decimal totalValue = products.Aggregate(0m, (total, product) => total + (product.Price * product.Stock)); Console.WriteLine($"総在庫価値: {totalValue:C}"); // -> 177.00 // 複合的な使用例 var summary = new { MostExpensive = products.OrderByDescending(p => p.Price).First().Name, AveragePrice = products.Average(p => p.Price), TotalStock = products.Sum(p => p.Stock), TotalValue = totalValue }; Console.WriteLine($"最も高価な商品: {summary.MostExpensive}"); // -> Mango Console.WriteLine($"平均価格: {summary.AveragePrice:C}"); // -> 0.65 Console.WriteLine($"総在庫数: {summary.TotalStock}"); // -> 360 Console.WriteLine($"総在庫価値: {summary.TotalValue:C}"); // -> 177.00 </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
LINQ - 集計
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse