C# LINQ Temelleri (Where, Select, OrderBy)
C# LINQ temellerini öğrenin. Where, Select ve OrderBy ile koleksiyonları sorgulama, filtreleme ve sıralama örneklerle anlatılıyor.
C#’ta LINQ (Language Integrated Query), koleksiyonlar ve veri kaynakları üzerinde sorgulama yapmayı kolaylaştıran güçlü bir özelliktir.
LINQ ile diziler, listeler, XML veya veritabanı sorguları üzerinde SQL benzeri ifadeler yazabilirsiniz.
Bu makalede LINQ’in temel operatörleri olan Where, Select ve OrderBy ele alınacaktır.
Where
Where metodu, belirli bir koşulu sağlayan elemanları filtrelemek için kullanılır.
Bir predicate (bool döndüren fonksiyon) alır.
using System;
using System.Linq;
using System.Collections.Generic;
var sayilar = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Çift sayıları seçelim
var ciftler = sayilar.Where(s => s % 2 == 0);
Console.WriteLine(string.Join(", ", ciftler));
// Çıktı: 2, 4, 6, 8, 10
Deferred Execution (Gecikmeli Çalışma):
var result = books.Where(...) yazdığınızda sorgu hemen çalışmaz.
LINQ yalnızca bir sorgu tanımı oluşturur. Filtreleme işlemi, sonuç
enumerate edildiğinde (örneğin foreach ile) veya
ToList(), ToArray(), Count()
gibi metotlar çağrıldığında gerçekleşir.
Deferred Execution Örneği
var sayilar = new List<int>
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
var ciftler = sayilar.Where(n => n % 2 == 0);
// Sorgu tanımlandıktan sonra koleksiyonu değiştirelim
sayilar.Add(11);
sayilar.Add(12);
sayilar.Add(13);
sayilar.Add(14);
// Sorgu burada çalışır
Console.WriteLine(string.Join(", ", ciftler));
// Çıktı: 2, 4, 6, 8, 10, 12, 14
12 ve 14 değerlerinin, Where satırından
sonra eklenmiş olmalarına rağmen sonuçta yer aldığını fark edin.
Bunun nedeni Where metodunun deferred execution kullanması
ve koleksiyonu enumerate edildiği anda değerlendirmesidir.
Select
Select, koleksiyonun her bir elemanını dönüştürmek (projection) için kullanılır.
Örneğin sayılardan karelerini üretmek veya nesnelerden sadece belirli alanları almak mümkündür.
var kareler = sayilar.Select(s => s * s);
Console.WriteLine(string.Join(", ", kareler));
// Çıktı: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
// Nesne örneği
var ogrenciler = new List<(int Id, string Ad)>
{
(1, "Ali"),
(2, "Ayşe"),
(3, "Mehmet")
};
// Sadece isimleri seçelim
var isimler = ogrenciler.Select(o => o.Ad);
Console.WriteLine(string.Join(", ", isimler));
// Çıktı: Ali, Ayşe, Mehmet
OrderBy
OrderBy, elemanları belirli bir kritere göre sıralamak için kullanılır.
Varsayılan olarak artan sıralama yapar. OrderByDescending ile azalan sıralama yapılabilir.
var karisik = new List<string> { "Elma", "Armut", "Muz", "Kivi" };
// Harf sırasına göre sırala
var sirali = karisik.OrderBy(m => m);
Console.WriteLine(string.Join(", ", sirali));
// Çıktı: Armut, Elma, Kivi, Muz
// Uzunluğa göre azalan sırala
var uzunlukSirali = karisik.OrderByDescending(m => m.Length);
Console.WriteLine(string.Join(", ", uzunlukSirali));
// Çıktı: Armut, Elma, Muz, Kivi
Where + Select + OrderBy Birlikte Kullanımı
LINQ operatörleri genellikle zincirleme (chaining) şekilde birlikte kullanılır. Aşağıdaki örnekte: önce filtreleme yapılır, sonra dönüşüm, ardından sıralama.
var sayilar2 = new List<int> { 10, 3, 7, 8, 2, 15, 6 };
// 5'ten büyük sayıların karelerini al, küçükten büyüğe sırala
var sonuc = sayilar2
.Where(s => s > 5)
.Select(s => s * s)
.OrderBy(s => s);
Console.WriteLine(string.Join(", ", sonuc));
// Çıktı: 36, 49, 64, 100, 225
Örnek Uygulama: Kitap Listesi
Aşağıdaki senaryoda kitap listesi üzerinde LINQ sorguları yapılmaktadır:
200 sayfadan fazla olan kitaplar filtreleniyor (Where),
sadece isimleri seçiliyor (Select),
ve uzunluğa göre sıralanıyor (OrderBy).
public class Book
{
public string Title { get; set; } = string.Empty;
public int Pages { get; set; }
}
class Program
{
static void Main()
{
var books = new List<Book>
{
new Book { Title = "C# Programlama", Pages = 350 },
new Book { Title = "LINQ Rehberi", Pages = 220 },
new Book { Title = "Kısa Hikayeler", Pages = 120 },
new Book { Title = "Algoritmalar", Pages = 400 }
};
var result = books
.Where(b => b.Pages > 200)
.Select(b => b.Title)
.OrderBy(t => t.Length);
Console.WriteLine("Seçilen Kitaplar:");
foreach (var title in result)
Console.WriteLine(title);
}
}
// Çıktı:
// Seçilen Kitaplar:
// LINQ Rehberi
// C# Programlama
// Algoritmalar
TL;DR
Where: Filtreleme için kullanılır.Select: Dönüşüm/projection yapar.OrderBy: Sıralama yapar (artan/azalan).- Operatörler zincirleme kullanılabilir:
Where → Select → OrderBy. - LINQ, koleksiyonlar üzerinde SQL benzeri güçlü sorgular yazmayı sağlar.