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?

Bagaimanakah saya boleh menggunakan Linq's Groupby, Sum, dan Count untuk berkumpulan, jumlah, dan mengira item yang cekap dalam koleksi, mengelakkan perangkap biasa?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-24 16:42:12483semak imbas

How can I use LINQ's GroupBy, Sum, and Count to efficiently group, sum, and count items in a collection, avoiding common pitfalls?

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!

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