- Bir lambda ifadesini (
x => ...) okumak ve yazmak Where,SelectveOrderByile bir koleksiyonu filtrelemek, dönüştürmek ve sıralamakSum,Average,Count,AnyveGroupByile 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
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.
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)}");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.
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);Aysel, Nigar, Leyla Average: 79.4 Everyone passed: False Anyone above 90: True Best: Aysel
| Metot | Ne yapar |
|---|---|
Where(x => ...) | koşula uyan elemanları seçer |
Select(x => ...) | her elemanı başka bir değere dönüştürür |
OrderBy / OrderByDescending | artan / azalan sırada sıralar |
Sum, Average, Min, Max, Count | toplam, ortalama, en küçük, en büyük, sayı |
First / FirstOrDefault | ilk elemanı verir; boşsa hata / null |
Any / All | en 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.
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);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.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.
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));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. Wherefiltreler,Selectdönüştürür,OrderBy/OrderByDescendingsıralar.Sum,Average,Max,Count,AnyveAllbü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.
int[] a = [1, 2, 3, 4]; verildiğinde a.Where(n => n > 2).Sum() nedir?