Yükleniyor...

C# LINQ İleri Seviye (GroupBy, Join, Aggregate)

C#’ta ileri seviye LINQ konularını öğrenin: GroupBy, Join ve Aggregate ile karmaşık veri sorgularını yönetin.

LINQ yalnızca temel filtreleme ve sıralama işlemleriyle sınırlı değildir. Daha karmaşık veri işlemleri için GroupBy, Join ve Aggregate gibi ileri seviye operatörler sunar. Bu makalede bu operatörlerin kullanımını örneklerle inceleyeceğiz.


GroupBy

GroupBy, koleksiyon elemanlarını belirli bir özelliğe göre gruplar. Gruplar üzerinde sorgular yaparak istatistiksel bilgiler çıkarabilirsiniz.


using System;
using System.Linq;
using System.Collections.Generic;

var ogrenciler = new List<(string Ad, string Sehir)>
{
    ("Ali", "İstanbul"),
    ("Ayşe", "Ankara"),
    ("Mehmet", "İstanbul"),
    ("Zeynep", "Ankara"),
    ("Can", "İzmir")
};

// Öğrencileri şehirlerine göre gruplama
var gruplar = ogrenciler.GroupBy(o => o.Sehir);

foreach (var grup in gruplar)
{
    Console.WriteLine($"Şehir: {grup.Key} - Öğrenci Sayısı: {grup.Count()}");
    foreach (var ogr in grup)
        Console.WriteLine($"  {ogr.Ad}");
}

// Çıktı:
// Şehir: İstanbul - Öğrenci Sayısı: 2
//   Ali
//   Mehmet
// Şehir: Ankara - Öğrenci Sayısı: 2
//   Ayşe
//   Zeynep
// Şehir: İzmir - Öğrenci Sayısı: 1
//   Can

Join

Join, SQL’deki INNER JOIN mantığına benzer şekilde iki koleksiyonu ortak bir anahtar üzerinden birleştirir.


var ogrenciler = new List<(int Id, string Ad)>
{
    (1, "Ali"),
    (2, "Ayşe"),
    (3, "Mehmet")
};

var notlar = new List<(int OgrId, int Puan)>
{
    (1, 90),
    (2, 75),
    (3, 82)
};

// Öğrenciler ile notları Join ile birleştirme
var sonuc = ogrenciler.Join(
    notlar,
    o => o.Id,            // dış anahtar
    n => n.OgrId,         // iç anahtar
    (o, n) => new { o.Ad, n.Puan }
);

foreach (var item in sonuc)
    Console.WriteLine($"{item.Ad} → {item.Puan}");

// Çıktı:
// Ali → 90
// Ayşe → 75
// Mehmet → 82

Aggregate

Aggregate, bir koleksiyon üzerinde kümülatif işlem yapar. Bu, döngüye benzer şekilde çalışır ve akümülatör (biriktirici) değerini güncelleyerek sonuç üretir.


var sayilar = new List<int> { 2, 3, 4, 5 };

// Tüm sayıların çarpımı
int carpim = sayilar.Aggregate((acc, s) => acc * s);
Console.WriteLine(carpim); // 120

// Tüm sayıların virgülle ayrılmış string halini üretme
string metin = sayilar.Aggregate("Sayılar:", (acc, s) => acc + " " + s);
Console.WriteLine(metin);
// Çıktı: Sayılar: 2 3 4 5

Örnek Uygulama: Satış Raporu

Aşağıdaki örnekte satış kayıtları üzerinde GroupBy, Join ve Aggregate birlikte kullanılmaktadır.


public class Urun
{
    public int Id { get; set; }
    public string Ad { get; set; } = string.Empty;
}

public class Satis
{
    public int UrunId { get; set; }
    public int Adet { get; set; }
    public decimal Fiyat { get; set; }
}

class Program
{
    static void Main()
    {
        var urunler = new List<Urun>
        {
            new Urun { Id = 1, Ad = "Bilgisayar" },
            new Urun { Id = 2, Ad = "Telefon" },
            new Urun { Id = 3, Ad = "Tablet" }
        };

        var satislar = new List<Satis>
        {
            new Satis { UrunId = 1, Adet = 2, Fiyat = 10000 },
            new Satis { UrunId = 2, Adet = 5, Fiyat = 5000 },
            new Satis { UrunId = 1, Adet = 1, Fiyat = 9500 },
            new Satis { UrunId = 3, Adet = 3, Fiyat = 3000 }
        };

        // Ürün–satış join işlemi
        var rapor = urunler.Join(
            satislar,
            u => u.Id,
            s => s.UrunId,
            (u, s) => new { u.Ad, s.Adet, s.Fiyat }
        );

        // Ürün bazında gruplama
        var grupRapor = rapor.GroupBy(r => r.Ad);

        foreach (var grup in grupRapor)
        {
            var toplamCiro = grup.Aggregate(0m, (acc, r) => acc + (r.Adet * r.Fiyat));
            Console.WriteLine($"{grup.Key} → Satış Sayısı: {grup.Count()}, Ciro: {toplamCiro} TL");
        }
    }
}

// Örnek çıktı:
// Bilgisayar → Satış Sayısı: 2, Ciro: 29500 TL
// Telefon → Satış Sayısı: 1, Ciro: 25000 TL
// Tablet → Satış Sayısı: 1, Ciro: 9000 TL

TL;DR

  • GroupBy: Elemanları belirli bir anahtara göre gruplar.
  • Join: İki koleksiyonu ortak bir anahtar üzerinden birleştirir.
  • Aggregate: Kümülatif işlem yaparak tek bir sonuç üretir.
  • Bu operatörler, raporlama ve veri analizi senaryolarında çok güçlüdür.

İlişkili Makaleler