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

C# İle Lambda Expression Olan Extension Metod Yazmak

Önceki yazılarımdan Extension Metod Yazılışı ve Kullanımı başlıklı yazımda Extension metodun nasıl yazıldığına ve kullanıldığına değinmiştik.Ancak bir Extension metoda Lambda Expression ifadelerin nasıl tanımlandığından bahsetmedik.Haliyle bu yazımızda Lambda Expression dahil olan bir Extension metodu yazmayı ve kullanmayı örneklendireceğiz.

Öncelikle bir Extension metod nasıl oluşturuluyordu hatırlayalım.

    static class ExtensionOrnek
    {
        public static bool Ornek(this int sayi)
        {
            return true;
        }
    }

Yukarıdaki örnekte gördüğünüz gibi en sade bir biçimde Extension metod bulunmaktadır.Extension metodlar sadece static sınıflar içerisinde tanımlanabiliyorlardı.Metodun parametresinde bulunan “this int sayi” değeri, bu Extension metodun sadece “int” tipinden değerlerde çalışacağını söylemektedir.

Peki biz nasıl Lambda Expression dahil olan Extension metodlar yazacağız diye sorarsanız eğer öncelikle C# – Func(Önceden Tanımlanmış Delege Türü) başlıklı yazımı okumanızı tavsiye ederim.

Şimdi bir örneklendirme yapalım.
Sadece koleksiyonlar üzerinde çalışan iki Extension metod yazalım ve Lambda Expression ile birinde Where şartını, diğerinde Single olarak veri getirecek sorgulama gerçekleştirelim.

Tabi öncelikle bir Entity oluşturalım.

    class Doktor
    {
        public int ID { get; set; }
        public string Adi { get; set; }
        public string SoyAdi { get; set; }
        public bool AmeliyatVarmi { get; set; }
        public int AmeliyatSayisi { get; set; }
    }

Gördüğünüz gibi bir doktor tanımladım.Şimdi Extension metodlarımızı yazalım.

    static class Extension where T : class
    {
        public static IEnumerable ExtWhere(this IEnumerable List, Func<T, bool> LambdaExpression)
        {
            List Gelenler = new List();
            foreach (T item in List)
            {
                if (LambdaExpression(item))
                {
                    Gelenler.Add(item);
                }
            }
            return Gelenler;
        }

        public static T ExtFirstOrDefault<T>(this IEnumerable<T> List, Func<T, bool> LambdaExpression) where T : class
        {
            foreach (T item in List)
            {
                if (LambdaExpression(item))
                {
                    return item;
                }
            }

            return null;
        }
    }

Evet, gördüğünüz gibi Extension metodlarımızı yazmış olduk.”.NET” mimarisinde bulunan “Where” ve “FirstOrDefault” metodlarıyla karışmamaları için metod isimlerinin başına “Ext” getirdim.

Şimdi siz Extension metodları incelerken ben burada nasıl bir mantıkta çalışacağımızı anlatayım.Metodlarımıza bakarsanız eğer hemen hemen içlerinde aynı yapıları barındırmaktadırlar.Bu Extensionlar kullanıldıkları koleksiyonu this parametresi sayesinde getirmektedirler.Gelen bu koleksiyonun üzerinde metod içinde işlemler gerçekleştirilmektedir.İşte bu metodların işlemlerini tam olarak gerçekleştirebilmesi için “LambdaExpression” isimli parametremize bir şartları kontrol edecek olan metod bağlamamız gerekmektedir.Bu bağlayacağımız metodu da Extension metodu kullandığımız yerde, Lambda Expression ifadeleriyle sağlayacağız.

        static void Main(string[] args)
        {
            List<Doktor> Doktorlar = new List<Doktor> { 
                new Doktor{ ID=1, Adi = "Ali", SoyAdi="Yıldız", AmeliyatSayisi = 10, AmeliyatVarmi = false },
                new Doktor{ ID=2, Adi = "Gençay", SoyAdi="Yıldız", AmeliyatSayisi = 2, AmeliyatVarmi = false },
                new Doktor{ ID=3, Adi = "Emine", SoyAdi="Yıldız", AmeliyatSayisi = 20, AmeliyatVarmi = true },
                new Doktor{ ID=4, Adi = "Gülşah", SoyAdi="Yıldız", AmeliyatSayisi = 17, AmeliyatVarmi = false },
                new Doktor{ ID=5, Adi = "Sebahattin", SoyAdi="Yıldız", AmeliyatSayisi = 40, AmeliyatVarmi = true },
                new Doktor{ ID=6, Adi = "Nurettin", SoyAdi="Yıldız", AmeliyatSayisi = 40, AmeliyatVarmi = true },
            };

            var Gelenler = Doktorlar.ExtWhere(d => d.AmeliyatSayisi >17);

            foreach (var item in Gelenler)
            {
                Console.WriteLine(item.Adi + " " + item.SoyAdi);
            }

            Console.Read();
        }

Yukarıdaki kod bloğunu incelerseniz eğer “ExtWhere” metodunu denemiş olduk.Lambda İfadeleriyle şart vereceğimiz metodu da bu şekilde tanımladıktan sonra projeyi derleyip çalıştırdığımız zaman aldığımız sonuç aşağıdaki gibi olacaktır.
ExtensionLambdaExpression
Son olarak “ExtFirstOrDefault” metodumuzu deneyelim.

        static void Main(string[] args)
        {
            List<Doktor> Doktorlar = new List<Doktor> { 
                new Doktor{ ID=1, Adi = "Ali", SoyAdi="Yıldız", AmeliyatSayisi = 10, AmeliyatVarmi = false },
                new Doktor{ ID=2, Adi = "Gençay", SoyAdi="Yıldız", AmeliyatSayisi = 2, AmeliyatVarmi = false },
                new Doktor{ ID=3, Adi = "Emine", SoyAdi="Yıldız", AmeliyatSayisi = 20, AmeliyatVarmi = true },
                new Doktor{ ID=4, Adi = "Gülşah", SoyAdi="Yıldız", AmeliyatSayisi = 17, AmeliyatVarmi = false },
                new Doktor{ ID=5, Adi = "Sebahattin", SoyAdi="Yıldız", AmeliyatSayisi = 40, AmeliyatVarmi = true },
                new Doktor{ ID=6, Adi = "Nurettin", SoyAdi="Yıldız", AmeliyatSayisi = 40, AmeliyatVarmi = true },
            };

            var GelenDoktor = Doktorlar.ExtFirstOrDefault(d => d.ID == 2);
            Console.WriteLine(GelenDoktor.Adi + " " + GelenDoktor.SoyAdi);
            Console.Read();
        }

Yukarıdaki kod bloğunun işlem sonucu aşağıdadır.
ExtensionLambdaExpression2

Extension metodlar yazılımsal olarak esneklik payı sağladığından dolayı en çok tercih edilen tekniklerden biri olduğunu bilmenizi isterim…Extension metodlar büyük işlerin altından kalkabileceğinden dolayı kaliteli bir Extension sizin için iyi bir CV bile olabilir 🙂

İyi çalışmalar diliyorum..

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Okan dedi ki:

    Merhabalar hocam bazı sorularım olacaktı.

    Generic classlarda extension method yazılamıyor sanıyorum, aynı örneği denerken(Extension method must be defined in a non-generic static class) (IEnumerable daki bütün extension metodlar nasıl var oldu o zaman ? confusing..)
    3. görselde generic class tanımlaması Extension şeklinde olması gerekiyor gibi yoksa where keyword kullanamıyoruz.

    Yine 3.görselde List Gelenler = new List(); bu şekilde IEnumerable dan türeyen bir liste oluşturamadım. Parametre IEnumerable List ve tanımlama List Gelenler = new List(); şeklinde olacaktı diye düşünüyorum.

    Teşekkürler

    • Okan dedi ki:

      İlginç bir şekilde “” olarak yazdığım şeyler yorumda gitmemiş, acaba sizde yazarken silinmiş olabilir mi ? 😀

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir