Yükleniyor...

C# Lambda İfadeleri

C#’ta lambda ifadelerini öğrenin. Kısa sözdizimi, Func ve Action kullanımı ile LINQ sorgularında pratik örnekler keşfedin.

C#’ta lambda ifadeleri, anonim (isimsiz) metotları kısa ve okunabilir bir şekilde yazmayı sağlar. => (lambda operatörü) kullanılarak tanımlanır. Lambda ifadeleri özellikle LINQ sorgularında, olay (event) aboneliklerinde ve fonksiyonel programlama tarzında yoğun olarak kullanılır.


Temel Lambda Sözdizimi

Bir lambda ifadesi, parametre listesi ve gövdeden oluşur. Basit ifadelerde süslü parantezlere gerek yoktur, çok satırlı gövde kullanıldığında parantez ve return yazılabilir.


// Tek parametre, tek satırlık ifade
Func<int, int> kare = x => x * x;
Console.WriteLine(kare(5)); // 25

// Çok parametreli lambda
Func<int, int, int> topla = (a, b) => a + b;
Console.WriteLine(topla(3, 4)); // 7

// Çok satırlı lambda
Func<int, int, int> carp = (a, b) =>
{
    Console.WriteLine($"Çarpılıyor: {a} * {b}");
    return a * b;
};
Console.WriteLine(carp(2, 6)); // 12

Action ve Func ile Lambda

Lambda ifadeleri genellikle Action ve Func türleriyle birlikte kullanılır:


Action selamla = () => Console.WriteLine("Merhaba!");
selamla(); // Merhaba!

Func<string, int> uzunluk = s => s.Length;
Console.WriteLine(uzunluk("Lambda")); // 6

Lambda ve LINQ

Lambda ifadeleri en çok LINQ sorgularında kullanılır. Koleksiyonlar üzerinde filtreleme, sıralama ve projeksiyon işlemleri kolayca yapılabilir.


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

// Çift sayıları filtrele
var ciftler = sayilar.Where(x => x % 2 == 0);

Console.WriteLine(string.Join(", ", ciftler)); // 2, 4, 6

// Kareleri hesapla
var kareler = sayilar.Select(x => x * x);
Console.WriteLine(string.Join(", ", kareler)); // 1, 4, 9, 16, 25, 36

Event ile Lambda Kullanımı

Lambda ifadeleri, olayları yakalamak için pratik bir yöntemdir. Böylece ayrı bir metot tanımlamadan kısa bir şekilde olay yakalanabilir.


public class Button
{
    public event EventHandler? Click;

    public void SimulateClick()
    {
        Console.WriteLine("Butona basıldı!");
        Click?.Invoke(this, EventArgs.Empty);
    }
}

class Program
{
    static void Main()
    {
        var btn = new Button();

        // Event'i lambda ile yakala
        btn.Click += (s, e) => Console.WriteLine("Olay: Butona tıklandı.");

        btn.SimulateClick();
    }
}

Kapanış (Closure) ve Değişken Yakalama

Lambda ifadeleri tanımlandıkları scope’taki değişkenlere erişebilir. Bu duruma closure denir.


int sayac = 0;

Action arttir = () =>
{
    sayac++;
    Console.WriteLine($"Sayaç: {sayac}");
};

arttir(); // Sayaç: 1
arttir(); // Sayaç: 2

Burada lambda ifadesi dışarıdaki sayac değişkenini “yakalar” ve üzerinde işlem yapmaya devam eder.


Örnek: Filtreleme ve Raporlama

Bir mağaza uygulamasında ürünleri fiyatlarına göre filtrelemek ve raporlamak için lambda ifadeleri kullanılabilir.


public class Product
{
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
}

class Program
{
    static void Main()
    {
        var products = new List<Product>
        {
            new Product { Name = "Laptop", Price = 25000m },
            new Product { Name = "Mouse", Price = 300m },
            new Product { Name = "Klavye", Price = 600m },
            new Product { Name = "Monitör", Price = 4500m }
        };

        // 1000 TL üzerindeki ürünleri bul
        var pahaliUrunler = products.Where(p => p.Price > 1000);

        foreach (var p in pahaliUrunler)
        {
            Console.WriteLine($"{p.Name} - {p.Price} TL");
        }

        // Ortalama fiyat hesapla
        var ort = products.Average(p => p.Price);
        Console.WriteLine($"Ortalama fiyat: {ort:0.00} TL");
    }
}

TL;DR

  • => operatörüyle kısa ve anonim metotlar tanımlanır.
  • Action ve Func ile birlikte yaygın kullanılır.
  • LINQ’ta filtreleme, seçme, sıralama için vazgeçilmezdir.
  • Event aboneliklerinde ek kod yazmadan kullanılabilir.
  • Kapanış (closure) ile dışarıdaki değişkenlere erişebilir.

İlişkili Makaleler

C# Delegates ve Events

C#’ta delegate ve event kavramlarını öğrenin. Olay tabanlı programlama, callback mantığı ve kullanım senaryoları örneklerle anlatılıyor.

C# Extension Metotlar

C#’ta extension metotları öğrenin. Mevcut sınıfları değiştirmeden yeni metotlar eklemeyi örneklerle keşfedin.