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 instanceFoo
berdasarkan propertiBar
. - 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 nilaiLum
dari objek-objek yang dikelompokkan. - Pemilihan Akhir: Pemilihan akhir merangkai semuanya menjadi objek baru yang berisi nilai
Bar
dan daftar nilaiLum
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 nilaiBar
dan nilaiLum
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!