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 örneklerini Bar ö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ış nesnelerden Lum değerlerinden oluşan yeni bir koleksiyon oluşturmanıza olanak tanır.
  • Son Seçim: Son seçim, Bar değerini ve ilgili Lum 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 gelen Lum değerlerini içeren yeni bir anonim nesne oluşturmak için Select 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!