linq:groupby、sum、およびcount for efficive data aggreation
この記事では、C#プログラミングの一般的な課題について説明します。LINQの、GroupBy
、およびCount
、
、Product
、ProductCode
のオブジェクトのコレクションを想像してください。目標は、これらの製品をPrice
でグループ化し、各コードの合計価格を計算し、各グループの製品の数をカウントすることです。 目的の出力は、各アイテムが製品コード、その総価格、および製品数を表す新しいコレクションです。
Name
ProductCode
初期(欠陥)アプローチ
最初の試みは次のようになるかもしれません:
このコードの問題は、の使用です。 これにより、グループ化された結果が平らになり、間違った
(常に1)になります。<code class="language-csharp">List<Product> products = LoadProducts(); List<ResultLine> result = products .GroupBy(p => p.ProductCode) .SelectMany(group => group.Select( p => new ResultLine { ProductName = p.Name, Quantity = group.Count().ToString(), Price = group.Sum(p => p.Price).ToString(), })) .ToList();</code>
正しいソリューションSelectMany
Quantity
を回避し、各グループから集約されたデータを直接選択します。 この改訂されたコードは、製品を正しくグループ化します。 各グループの最初の製品から名前を取得します(同じ製品コードの一貫した名前を想定しています)。
各グループの正確なカウントを提供し、合計価格を計算します。 SelectMany
および
<code class="language-csharp">List<ResultLine> result = products .GroupBy(p => p.ProductCode) .Select(group => new ResultLine { ProductName = group.First().Name, // Assumes all products with the same code have the same name Quantity = group.Count(), Price = group.Sum(p => p.Price), }) .ToList();</code>
group.First().Name
を排除し、グループプロパティに直接アクセスすることにより、効率的かつ正確なデータ集約を実現し、意図しないデータの平坦化の一般的な落とし穴を回避します。 このアプローチにより、結果のコレクションが、元の製品コレクションからのグループ化、合計、およびカウントされたデータを正確に反映することが保証されます。
以上がLINQのGroupBy、合計、カウントを使用して、コレクション内の項目を効率的にグループ化、合計、およびカウントするにはどうすればよいですか。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。