Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Lambda İfadeleri (Lambda Expressions)

Lambda ifadeleri anonim bir fonksiyon olarak isimlendirilebilir.Dikkatinizi çekerim ki, metod değil de fonksiyon olarak tanımlıyorum.Temelde belli bir giriş değerine, sonuç üreten bir fonksiyon tipidir.
Lambda ifadelerini kullanırken =>(Lambda Operatörü) ifadesini kullanırız.
Bu ifadenin sol tarafında fonksiyonda kullanılacak bir değişken tanımlanırken, sağ tarafında ise o değişken değerinde sonuç üretek ifadeler yer alır.Kısada solundaki ifade, sağındaki ifadeye parametre olarak geçirilir.

Örnek olarak;

  • x => x+2
  • Y => (Y*2)/9
  • Ahmet => Ahmet > 0   //Sonuç olarak true ya da false üretir.

Hiç uzatmadan Lambda ifadelerini nerde nasıl kullanacağız inceleyelim.
İncelememizi örnek bir int tipinden dizi değişkenimiz üzerinde yapacağız.

int[] Sayilar = new int[] { 1, 3, 5, 7, 8, 89, 65, 453, 43423, 3232423 };

Bu dizide 5 ten büyük olan sayıları Lambda ifadesi kullanmadan siz bildiğiniz yollarla yapabilirsiniz.Ancak Lambda kullanarak nasıl yapacağız onu göstereyim.
Yukarıdaki resmi incelerseniz, extension olan Where metodunu kullanacağız.Ancak burdan her extension metodda demek ki Lambda kullanıyormuş sonucunu çıkarmayın.Metodun parametresinde gördüğünüz gibi ,”Func<int,bool> predicate” gibi bir ifade varsa eğer o metodda Lambda ifadesi kullanılabilir demektir.Bazı metodlarda “predicate” yerine “selector” yazabilir.Fark etmez.

Lambda ifadesinin kullanım şartı metoduna göre değişmektedir.Where metodunda Lambda kullanım tarzına bakarsak eğer, “Func<int,bool>” demektedir.Yani şunu söylüyor.Lambda operatörünün “=>” sol tarafında int bir değer olacak, fonksiyonun sağında ise geriye bool dönebilecek bir ifade kümesi olacak diyor.Aşağıdaki kod bloğunu incelerseniz Where metoduna uygun Lambda ifadesini nasıl yazdığımı anlayacaksınız.

            int[] Sayilar = new int[] { 1, 3, 5, 7, 8, 89, 65, 453, 43423, 3232423 };
            IEnumerable SayilarKumesi = Sayilar.Where(Sayi => Sayi > 5);

Yukarıda gördüğünüz gibi, Where metodu içine Lambda parametresini yazdım.Bizden operatörün solunda int , sağında geriye bool tipten geri dönen bir ifade istiyordu.Dikkat ederseniz, operatörün soluna Sayi adında bir değişken tanımladım.Sağında ise bool tipten geri dönecek bir şart.Sağ taraf tamamda sol taraftaki Sayi değişkeninin int olması gerekmiyor muydu? diyorsunuz.Şu anda int tipinden Sayilar dizi değişkeni üzerinde çalıştığımız için Sayi değişkeni otomatik olarak int tipten algılanıyor.

Eğer biz int tipinde bir dizide değilde string tipindeki bir dizide çalışsaydık bakın ne olurdu.
Gördüğünüz gibi hangi tip dizi değişkenin üzerinde çalışıyorsak, o tipe göre Lambda ifadesi istem yapıyor.Bu bir tek Where metodu için geçerli değil.Lambda kullanan diğer metodlar içinde geçerlidir.Üstelik sadece dizilerde Lambda ifadeleri kullanıldığını sanmayınız.Koleksiyonlarda da kullanılmaktadır.

Lambda ifadelerini bir başka kullanım tarzıda,

            int[] Sayilar = new int[] { 1, 3, 5, 7, 8, 89, 65, 453, 43423, 3232423 };
            Func<int, bool> OzelFonksiyonum = xx => xx > 5;
            Sayilar.Where(OzelFonksiyonum);

Şimdi bir kaç örnek ile yazımı bitirelim.
Bu örneklerimde de,önceki yazılarımda kullandığım Northwind.dbml yi aynen kullanmaktayım.
Beverages kategorisindekşi ürünlerden elde edilen toplam gelir ?Yukarıda Lambda ifadesiyle toplam geliri alırken, Lambda ifadesinin benden istediğine bakın.Solda Satis_Detay tipinden,sağda geriye decimal tipinden dönen ifade.Solda Satis_Detay tipini istemesinin sebebi, o anda Satis_Detaylari tipinden koleksiyonunda çalışıyor olmamızdandır.

NorthwindDataContext Northwind = new NorthwindDataContext();
var Sonuc = from urun in Northwind.Urunlers
where urun.Kategoriler.KategoriAdi == "Beverages"
select new
{
UrunAdi = urun.UrunAdi,
SatilanToplamUrunSayisi = urun.Satis_Detaylaris.Count,
ToplamGelir = urun.Satis_Detaylaris.Sum(Satis => Satis.Miktar * Satis.BirimFiyati)
};
foreach (var item in Sonuc)
{
listBox1.Items.Add(item.UrunAdi + " " + item.SatilanToplamUrunSayisi + " " + item.ToplamGelir);
}

7 nolu üründen kaç adet satılmıştır?

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = (from urun in Northwind.Urunlers
                         select urun).Count(Urun => Urun.UrunID == 7);

            //Yukarıdaki ile aynı sonucu verir.

            var Sonuc2 = (from urun in Northwind.Urunlers
                         where urun.UrunID == 7
                          select urun).Count() ;

10530 nolu satışı getirelim.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = from satis in Northwind.Satislars
                        where satis.SatisID == 10530
                        select satis;

            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.SevkAdi);
            }

Satislar tablosunda 10530 nolu tek bir satis olduğuna %100 eminim.Yani bir tane sonuç geleceğini biliyorum.Tamam sonuçta 10530 nolu satis tek geldiğini bilsemde, var tipinden Sonuc adlı bir koleksiyona atılıyor.Ama şunu biliyorum ki o koleksiyondan sadece tek bir kayıt çekecem.

Eğer koleksiyondan tek bir kayıt çekecekseniz Single kullanabilirsiniz.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satislars.Single(Satis => Satis.SatisID == 10530);
            listBox1.Items.Add(Sonuc.SevkAdi);

NOT!!! Olmayan bir kaydı Single ile çağırmaya çalışırsak hata alırız.
Personel ID si 4 olan personelin ilk satışını çekelim.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satislars.First(Satis => Satis.PersonelID == 4);
            listBox1.Items.Add(Sonuc.SatisID);

First() metodu ile koleksiyondaki ilk elemanı çeker.

Personel ID si 4 olan tüm satışları getirelim.Sonra da sevk adlarına göre artan bir şekilde sıralayalım.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satislars.Where(Satis => Satis.PersonelID == 4).OrderBy(Satis=> Satis.SevkAdi);
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.SevkAdi);
            }

Satisları çekelim, ilk 5 kaydı sonuç kümesinden çıkarıp geri kalanını getirtelim.(6. başlar)

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satislars.Skip(5);
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.SatisID);
            }

<hr>
ToLookup() Metodu:Belirtilen kolon ismini key olarak düşünüğ, nesneyi de value olarak saklayan bir key – value koleksiyonu geriye döner.Aşağıdaki örnekte Satislar nesnesinin SevkAdi kolonu key olarak Satislar nesneside value olarak saklanacaktır.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satislars.ToLookup(Satis => Satis.SevkAdi);
            Satislar s = Sonuc["Ernst Handel"].First();
            listBox1.Items.Add(s.SevkAdi + " " + s.SatisID);

Lambda ifadeleri hakkında anlatacaklarım bu kadar.
Umarım faydasını görürsünüz.
Sonraki yazılarımda görüşmek üzere..
İyi Çalışmalar 🙂

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 25 Ocak 2021

    […] nedir bu özellik? Klasik bir C# kodunu incelediğinizde yüksek ihtimal lambda expression‘ların yoğun bir şekilde kullanıldığını görmeniz kuvvetle muhtemel. Lambda ifadeleri […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*