Yükleniyor...

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.

İlişkili Makaleler