C#‘da LINQ ve Lambda İfadeleri ile Bellekte Listeleri Gruplama
C#‘da listelerle çalışırken, belirli bir özellik temelinde öğeleri gruplamanız gereken çeşitli senaryolarla karşılaşabilirsiniz. Örneğin, elinizde Foo
nesnelerinden oluşan bir koleksiyon olduğunu varsayalım ve bunları Bar
özelliklerinin değerlerine göre düzenlemek istiyorsunuz. Bu noktada, LINQ (Language Integrated Query) ve lambda ifadelerinin gücü devreye giriyor. Bu blog yazısında, bu C# özelliklerini kullanarak bellek içindeki listeleri nasıl etkili bir şekilde gruplayacağımızı keşfedeceğiz.
Problemin Anlaşılması
Bir Foo
nesneleri listesinin olduğunu düşünün; her Foo
nesnesinin Bar
ve Lum
özellikleri var. Bazı Foo
örnekleri Bar
için aynı değere sahip olabilir. Amacınız, bu Foo
örneklerini Bar
değerlerine göre gruplamak ve ardından gruplanmış koleksiyonlar üzerinde yineleme yaparak ilgili Lum
değerlerine erişmek. Bu, veri organizasyonunu geliştirebilir ve belirli veri setleriyle oynamayı kolaylaştırabilir.
Örnek Senaryo
Aşağıdaki Foo
örnekleri listesini düşünelim:
var foos = new List<Foo> {
new Foo{Bar = 1,Lum = 1},
new Foo{Bar = 1,Lum = 2},
new Foo{Bar = 2,Lum = 3},
};
İstenen Sonuç
Bu Foo
nesnelerini Bar
değerlerine göre gruplamak istiyoruz, nihayetinde aşağıdakine benzer bir sonuç alacağız:
Bar = 1
için:Lum = 1
,Lum = 2
Bar = 2
için:Lum = 3
LINQ Kullanarak Çözüm
Foo
nesnelerini, LINQ’in group by
ifadesini kullanarak gruplayabilirsiniz. İşte bunun nasıl gerçekleştirileceği:
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 };
Adımların Açıklaması
- Grupla:
group foo by foo.Bar
kısmıFoo
örnekleriniBar
özelliğine göre gruplar. - Gruplanmış Olarak: Bu, her grup için yeni bir kapsam oluşturur.
- Lum Değerlerini Seçme:
let lums
ifadesi, gruplanmış nesnelerdenLum
değerlerinden oluşan yeni bir koleksiyon oluşturmanıza olanak tanır. - Son Seçim: Son seçim,
Bar
değerini ve ilgiliLum
değerleri listesini içeren yeni bir nesne oluşturur.
Lambda İfadeleri Kullanarak Çözüm
Alternatif olarak, lambda ifadelerini kullanarak aynı sonuca ulaşabilirsiniz; bu, daha öz bir sözdizimi sunabilir. İşte nasıl:
var groupedFoos = foos.GroupBy(x => x.Bar)
.Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });
Nasıl Çalışır
- GroupBy: Bu yöntem, gruplamak istediğimiz özelliği belirtmek için bir lambda işlevi alır, yani
x.Bar
. - Select: Gruplandıktan sonra, her grup için
Bar
ve karşılık gelenLum
değerlerini içeren yeni bir anonim nesne oluşturmak içinSelect
kullanıyoruz.
Gruplandırılmış Veriler Üzerinde Döngü
LINQ veya lambda ifadelerini kullanmanız fark etmeksizin, gruplanmış veriler üzerinde yineleme yapmak aynı kalır. Her grup üzerinde döngü oluşturabilir ve Lum
değerlerini şu şekilde yazdırabilirsiniz:
foreach (var group in groupedFoos)
{
Console.WriteLine("Bar#" + group.Bar + " için Lums");
foreach (var lum in group.Lums)
{
Console.WriteLine(lum);
}
}
Çıktı şöyle olacaktır:
Bar#1 için Lums
1
2
Bar#2 için Lums
3
Sonuç
C#‘da LINQ veya lambda ifadeleri kullanarak bellek içindeki listeleri gruplamak, verilerinizi organize etmenin güçlü bir yoludur. LINQ sözdiziminin okunabilirliğini mi yoksa lambda ifadelerinin özlülüğünü mü tercih ederseniz edin, her iki yaklaşım da verilerinizi etkili bir şekilde istenen biçimde gruplamanıza olanak tanıyacaktır.
LINQ anlayışınızı derinleştirmek isteyenler için daha kapsamlı örnekler için 101 LINQ Örneği üzerine göz atmayı düşünebilirsiniz.
Herhangi bir sorunuz varsa veya C#‘da verileri gruplama konusundaki deneyimlerinizi paylaşmak isterseniz, aşağıda bir yorum bırakmaktan çekinmeyin!