Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menggunakan Linq's Groupby, Sum, dan Count untuk berkumpulan, jumlah, dan mengira item yang cekap dalam koleksi, mengelakkan perangkap biasa?
Menguasai LINQ: GroupBy, Sum dan Count untuk Pengagregatan Data yang Cekap
Artikel ini menangani cabaran biasa dalam pengaturcaraan C#: cekap mengumpulkan, menjumlahkan dan mengira item dalam koleksi menggunakan kaedah GroupBy
, Sum
dan Count
LINQ. Kami akan meneroka contoh praktikal, menyerlahkan perangkap biasa dan mengemukakan penyelesaian yang mantap.
Senario: Pengagregatan Produk
Bayangkan koleksi Product
objek, setiap satu dengan ProductCode
, Price
dan Name
. Matlamatnya adalah untuk mengumpulkan produk ini mengikut ProductCode
mereka, mengira jumlah harga untuk setiap kod dan mengira bilangan produk dalam setiap kumpulan. Output yang diingini ialah koleksi baharu dengan setiap item mewakili kod produk, jumlah harganya dan kiraan produk.
Pendekatan Awal (Cacat)
Percubaan awal mungkin kelihatan seperti ini:
<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>
Masalah dengan kod ini ialah penggunaan SelectMany
. Ini meratakan hasil terkumpul, membawa kepada Quantity
yang salah (sentiasa 1).
Penyelesaian Yang Betul
Penyelesaian yang cekap dan tepat mengelakkan SelectMany
dan secara langsung memilih data agregat daripada setiap kumpulan:
<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>
Kod yang disemak ini mengumpulkan produk dengan betul. group.First().Name
mendapatkan semula nama daripada produk pertama dalam setiap kumpulan (dengan mengandaikan nama yang konsisten untuk kod produk yang sama). group.Count()
menyediakan kiraan yang tepat untuk setiap kumpulan, dan group.Sum(p => p.Price)
mengira jumlah harga. Ambil perhatian bahawa Quantity
dan Price
kini daripada jenis angka yang sesuai (masing-masing int dan perpuluhan), meningkatkan integriti data.
Dengan menghapuskan SelectMany
dan mengakses secara terus sifat kumpulan, kami mencapai pengagregatan data yang cekap dan tepat, mengelakkan perangkap biasa perataan data yang tidak diingini. Pendekatan ini memastikan bahawa koleksi yang terhasil menggambarkan dengan tepat data yang dikumpulkan, dijumlahkan dan dikira daripada koleksi produk asal.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan Linq's Groupby, Sum, dan Count untuk berkumpulan, jumlah, dan mengira item yang cekap dalam koleksi, mengelakkan perangkap biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!