Rumah >pembangunan bahagian belakang >C++ >Bagaimana cara mengumpulkan, jumlah, dan mengira produk dengan betul di Linq dengan Groupby?

Bagaimana cara mengumpulkan, jumlah, dan mengira produk dengan betul di Linq dengan Groupby?

Patricia Arquette
Patricia Arquetteasal
2025-01-24 17:01:09849semak imbas

How to Correctly Group, Sum, and Count Products in LINQ with GroupBy?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn