Kumpulkan, jumlah dan kira produk menggunakan kaedah LINQ: GroupBy
Huraian Masalah
Kami mempunyai koleksi produk yang perlu dikumpulkan mengikut kod produk. Matlamatnya adalah untuk mencipta objek yang mengandungi nama produk, kuantiti produk dan jumlah harga untuk setiap kod produk.
Coretan kod (contoh ralat)
Kod awal menggunakan GroupBy
untuk mengumpulkan mengikut kod produk dan kemudian mengira jumlah dan kiraan untuk setiap kumpulan.
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .SelectMany(cl => cl.Select( csLine => new ResultLine { ProductName = csLine.Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), })).ToList<resultline>();</code>
Masalahnya
Walaupun kod ini mengira jumlah dengan betul, kiraan untuk semua produk sentiasa menunjukkan 1.
Contoh data
<code class="language-csharp">List<cartline> Lines = new List<cartline>(); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p1", Price = 6.5M, Name = "Product1" }); Lines.Add(new CartLine() { ProductCode = "p2", Price = 12M, Name = "Product2" });</code>
Hasil yang dijangkakan
<code>Product1: count 2 - Price:13 (2x6.5) Product2: count 1 - Price:12 (1x12)</code>
Penyelesaian
Masalahnya ialah menggunakan SelectMany
untuk menyemak setiap item dalam setiap kumpulan. Pendekatan yang betul ialah:
<code class="language-csharp">List<resultline> result = Lines .GroupBy(l => l.ProductCode) .Select(cl => new ResultLine { ProductName = cl.First().Name, Quantity = cl.Count().ToString(), Price = cl.Sum(c => c.Price).ToString(), }).ToList();</code>
Dengan mengandaikan produk dengan kod yang sama mempunyai nama yang sama, kita boleh menggunakan First()
untuk mendapatkan nama produk. SelectMany
meratakan set hasil, menyebabkan ralat mengira, manakala Select
beroperasi secara langsung pada hasil terkumpul.
Jawapan yang disemak ini mengekalkan imej dan memberikan penjelasan yang lebih tepat dan ringkas tentang masalah dan penyelesaian LINQ. Perkataan itu juga dilaraskan untuk kejelasan dan aliran yang lebih baik.
Atas ialah kandungan terperinci Bagaimana cara mengumpulkan, jumlah, dan mengira produk dengan betul di Linq dengan Groupby?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!