Mengelompokkan Daftar Dalam Memori di C# dengan Ekspresi LINQ dan Lambda

Saat bekerja dengan daftar di C#, Anda mungkin menemui berbagai skenario di mana Anda perlu mengelompokkan item berdasarkan properti tertentu. Misalnya, anggap Anda memiliki koleksi objek Foo, dan Anda ingin mengorganisirnya berdasarkan nilai properti Bar mereka. Di sinilah kekuatan LINQ (Language Integrated Query) dan ekspresi lambda berperan. Dalam posting blog ini, kita akan menjelajahi cara mengelompokkan daftar dalam memori menggunakan fitur C# ini secara efektif.

Memahami Masalah

Bayangkan Anda memiliki daftar objek Foo, di mana setiap Foo memiliki propertis Bar dan Lum. Beberapa instance Foo mungkin memiliki nilai yang sama untuk Bar. Tujuan Anda adalah untuk mengelompokkan instance Foo ini berdasarkan nilai Bar mereka dan kemudian mengiterasi koleksi yang dikelompokkan untuk mengakses nilai Lum yang bersangkutan. Ini dapat meningkatkan organisasi data dan memudahkan manipulasi set data tertentu.

Skenario Contoh

Mari kita pertimbangkan contoh spesifik dengan daftar instance Foo berikut:

var foos = new List<Foo> {
   new Foo{Bar = 1,Lum = 1},
   new Foo{Bar = 1,Lum = 2},
   new Foo{Bar = 2,Lum = 3},
};

Hasil yang Diinginkan

Kita ingin mengelompokkan instance Foo ini berdasarkan nilai Bar mereka, yang akhirnya menghasilkan sesuatu seperti:

  • Untuk Bar = 1: Lum = 1, Lum = 2
  • Untuk Bar = 2: Lum = 3

Solusi Menggunakan LINQ

Anda dapat mengelompokkan objek Foo menggunakan klausa group by dari LINQ. Berikut cara mencapainya:

var groupedFoos = from foo in foos
                  group foo by foo.Bar into grouped
                  let lums = from g in grouped
                             select g.Lum
                  select new { Bar = grouped.Key, Lums = lums };

Langkah-langkah Dijelaskan

  • Group By: Bagian group foo by foo.Bar mengelompokkan instance Foo berdasarkan properti Bar.
  • Into Grouped: Ini menciptakan ruang lingkup baru untuk setiap grup.
  • Memilih Nilai Lum: Pernyataan let lums memungkinkan Anda untuk membuat koleksi baru yang terdiri dari nilai Lum dari objek-objek yang dikelompokkan.
  • Pemilihan Akhir: Pemilihan akhir merangkai semuanya menjadi objek baru yang berisi nilai Bar dan daftar nilai Lum yang bersangkutan.

Solusi Menggunakan Ekspresi Lambda

Sebagai alternatif, Anda bisa mencapai hasil yang sama menggunakan ekspresi lambda, yang menawarkan sintaks yang lebih ringkas. Berikut caranya:

var groupedFoos = foos.GroupBy(x => x.Bar)
                      .Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });

Cara Kerjanya

  • GroupBy: Metode ini mengambil fungsi lambda untuk menentukan properti yang ingin kita kelompokkan, yaitu x.Bar.
  • Select: Setelah pengelompokan, kita menggunakan Select untuk membuat objek anonim baru untuk setiap grup, yang berisi nilai Bar dan nilai Lum yang bersangkutan.

Mengiterasi Data yang Dikelompokkan

Terlepas dari apakah Anda menggunakan LINQ atau ekspresi lambda, mengiterasi melalui data yang dikelompokkan tetap sama. Anda dapat melakukan loop melalui setiap grup dan mencetak nilai Lum sebagai berikut:

foreach (var group in groupedFoos)
{
    Console.WriteLine("Lums untuk Bar#" + group.Bar);
    foreach (var lum in group.Lums)
    {
        Console.WriteLine(lum);
    }
}

Outputnya akan seperti:

Lums untuk Bar#1
1
2
Lums untuk Bar#2
3

Kesimpulan

Mengelompokkan daftar dalam memori menggunakan LINQ atau ekspresi lambda di C# adalah cara yang kuat untuk mengorganisir data Anda. Apakah Anda lebih suka keterbacaan sintaks LINQ atau keringkasan ekspresi lambda, kedua pendekatan ini akan memungkinkan Anda untuk mencapai pengelompokkan data yang diinginkan secara efektif.

Bagi Anda yang ingin memperdalam pemahaman tentang LINQ, pertimbangkan untuk menjelajahi 101 Contoh LINQ untuk contoh yang lebih komprehensif.

Jika Anda memiliki pertanyaan atau ingin berbagi pengalaman Anda tentang pengelompokan data di C#, jangan ragu untuk meninggalkan komentar di bawah!