İçeriğe geç
Educora
İleri19 dk9 / 16

LINQ: verileri sorgulamak

Lambda ifadeleri ve LINQ metotlarıyla koleksiyonları filtrele, dönüştür, sırala ve topla: `Where`, `Select`, `OrderBy`, `Sum`, `Average`, `GroupBy`.

Kendini test et
Bu derste öğreneceklerin
  • Bir lambda ifadesini (x => ...) okumak ve yazmak
  • Where, Select ve OrderBy ile bir koleksiyonu filtrelemek, dönüştürmek ve sıralamak
  • Sum, Average, Count, Any ve GroupBy ile sonuçları özetlemek
  • Ertelenmiş yürütmeyi ve ToList()'in rolünü açıklamak

Bir sınıf listesinde 80'in üzerinde puan alan öğrencileri bulman, onları büyükten küçüğe sıralaman ve yalnızca adlarını alman gerekiyor. Döngülerle bu; yeni listeler, if deyimleri ve sıralama kodu demektir. LINQ (Language Integrated Query, yani dile gömülü sorgu) ile aynı iş birkaç okunaklı satırda yapılır; sanki bilgisayara yalnızca ne istediğini söylüyorsun.

Lambda ifadeleri

Tanım
Lambda ifadesi

Adı olmayan kısa bir fonksiyon: okun (=>) solunda parametre, sağında sonuç yazılır. n => n * 2 “n'yi al, n · 2 döndür” demektir; s => s.Score >= 80 ise “öğrencinin puanı 80 veya daha fazla mı?” sorusuna true/false ile cevap verir.

LINQ metotları her koleksiyonla çalışır (dizi, List<T>, sözlük) ve argüman olarak bir lambda alır. Orijinal koleksiyonu değiştirmezler, yeni bir sonuç döndürürler. Aşağıdaki örnekte Where koşula uyan elemanları seçer, Select her elemanı dönüştürür, OrderBy ise sıralar.

C#
int[] numbers = [5, 12, 8, 3, 20, 7];

var evens = numbers.Where(n => n % 2 == 0);
var doubled = numbers.Select(n => n * 2);
var sorted = numbers.OrderBy(n => n);

Console.WriteLine(string.Join(", ", evens));
Console.WriteLine(string.Join(", ", doubled));
Console.WriteLine(string.Join(", ", sorted));
Console.WriteLine($"Sum: {numbers.Sum()}, max: {numbers.Max()}");
Console.WriteLine($"Greater than 6: {numbers.Count(n => n > 6)}");
Beklenen çıktı
12, 8, 20
10, 24, 16, 6, 40, 14
3, 5, 7, 8, 12, 20
Sum: 55, max: 20
Greater than 6: 4

Metotları zincirlemek

Her LINQ metodu yeni bir dizi döndürdüğü için bir sonraki metot hemen onun üzerinde çağrılabilir. Böyle bir zincir yukarıdan aşağıya bir cümle gibi okunur: “80 ve üzeri alanları seç, puana göre büyükten küçüğe sırala, adlarını al”. Zincirler genellikle her metot ayrı bir satırda olacak şekilde yazılır.

C#
using System.Globalization;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

List<Student> students =
[
    new("Aysel", 95), new("Murad", 78), new("Leyla", 88),
    new("Elvin", 45), new("Nigar", 91)
];

var topNames = students
    .Where(s => s.Score >= 80)
    .OrderByDescending(s => s.Score)
    .Select(s => s.Name);
Console.WriteLine(string.Join(", ", topNames));

Console.WriteLine($"Average: {students.Average(s => s.Score):F1}");
Console.WriteLine($"Everyone passed: {students.All(s => s.Score >= 50)}");
Console.WriteLine($"Anyone above 90: {students.Any(s => s.Score > 90)}");
Console.WriteLine($"Best: {students.OrderByDescending(s => s.Score).First().Name}");

record Student(string Name, int Score);
Beklenen çıktı
Aysel, Nigar, Leyla
Average: 79.4
Everyone passed: False
Anyone above 90: True
Best: Aysel
MetotNe yapar
Where(x => ...)koşula uyan elemanları seçer
Select(x => ...)her elemanı başka bir değere dönüştürür
OrderBy / OrderByDescendingartan / azalan sırada sıralar
Sum, Average, Min, Max, Counttoplam, ortalama, en küçük, en büyük, sayı
First / FirstOrDefaultilk elemanı verir; boşsa hata / null
Any / Allen az biri / hepsi koşula uyuyor mu
GroupBy(x => ...)elemanları bir anahtara göre gruplar
ToList()sonucu hazır bir listeye çevirir

Gruplama

GroupBy, elemanları ortak bir anahtara göre gruplara ayırır: örneğin ürünleri kategoriye göre. Her grubun bir Key özelliği (anahtar) vardır ve grubun kendisi de bir koleksiyondur; bu yüzden üzerinde Count ve Sum çağrılabilir. FirstOrDefault ise uygun eleman bulamazsa hata fırlatmaz, null döndürür.

C#
List<Product> products =
[
    new("Laptop", "Electronics", 1500),
    new("Pen", "Stationery", 2),
    new("Phone", "Electronics", 900),
    new("Notebook", "Stationery", 5),
    new("Mouse", "Accessories", 25)
];

var groups = products
    .GroupBy(p => p.Category)
    .OrderBy(g => g.Key);

foreach (var g in groups)
    Console.WriteLine($"{g.Key}: {g.Count()} item(s), total {g.Sum(p => p.Price)} AZN");

Product? cheap = products.FirstOrDefault(p => p.Price < 1);
Console.WriteLine(cheap is null ? "No product under 1 AZN" : cheap.Name);

record Product(string Name, string Category, decimal Price);
Beklenen çıktı
Accessories: 1 item(s), total 25 AZN
Electronics: 2 item(s), total 2400 AZN
Stationery: 2 item(s), total 7 AZN
No product under 1 AZN
Product? türündeki soru işareti, değişkenin null olabileceğini belirtir.
Etkileşimli
Simülasyon yükleniyor…
OrderBy, sıralama algoritmasını kendin yazma zahmetinden kurtarır. Burada basit algoritmalardan birinin adım adım nasıl çalıştığını izleyebilirsin.

Ertelenmiş yürütme

Where ve Select çağrıldığında henüz hiçbir şey hesaplanmaz; yalnızca “tarif” saklanır. Sorgu, sonuç gerçekten istendiğinde çalışır: foreach içinde, string.Join'de ya da Sum gibi metotlarda. Buna ertelenmiş yürütme denir. Sonucu o anda “dondurmak” için ToList() çağır.

C#
List<int> scores = [50, 70, 90];

var high = scores.Where(s => s > 60);
var snapshot = scores.Where(s => s > 60).ToList();

scores.Add(100);

Console.WriteLine(string.Join(", ", high));
Console.WriteLine(string.Join(", ", snapshot));
Beklenen çıktı
70, 90, 100
70, 90
high sorgusu 100 eklendikten sonra çalıştı; snapshot ise önceden hazırlanmıştı.

Önemli noktalar

  • Lambda, adı olmayan kısa bir fonksiyondur: n => n * 2.
  • Where filtreler, Select dönüştürür, OrderBy/OrderByDescending sıralar.
  • Sum, Average, Max, Count, Any ve All bütün koleksiyondan tek bir cevap üretir.
  • LINQ orijinal koleksiyonu değiştirmez; metotlar zincirlenebilir.
  • Sorgu, sonuç istendiğinde çalışır; ToList() sonucu hemen oluşturur.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
int[] a = [1, 2, 3, 4]; verildiğinde a.Where(n => n > 2).Sum() nedir?