Kendi LINQ Metodumuzu Yazalım

on 2 Aralık 2016 Cuma
Çoğu zaman üreteceğimiz çözümlerde, yazacağımız kodlarda Linq metotlarını kullanmadan edemiyoruz. Kendi Linq metotlarımızı nasıl yazarız ona bakalım. Linq metotlarını yazabilmemiz için extension metot ve yield operatörü konuları bize yardımcı olacak konulardır. İlk olarak Filtrele adında bir metot yazalım ve where ile aynı işi yapsın.



public static class BizimEnumerable
    {
        public static IEnumerable<T> Filtrele<T>(this IEnumerable<T> source, Func<T, bool> predicate)
        {
            foreach (T obj in source)
            {
                if (predicate(obj))
                    yield return obj;
            }
        }
    }

Metodun aldığı parametrelere bakarsak this anahtar sözcüğü ile metodun hangi tipler üzerinde çıkacağını belirtiyoruz. Generic IEnumerable interface’ini implement eden tüm sınıflar bu metodu kullanabilecekler. ikinci parametre ise ‘T’ tipinden parametre alarak geriye bool dönen bir delegedir. Bunun anlamı, parametre olarak bir metot göndermektir. Ya bu imzaya uygun bir metot yazıp bu metodu parametre olarak göndeririz. Ya da metodu anonim olarak tanımlarız. Biz lamb’da operatörü ile anonim metot göndereceğiz. Metodun içerisinde yield operatörü yardımıyla iterasyon(MoveNext, Reset, Current ) yapılır. ikinci parametrede belirtmiş olduğumuz anonim metoda parametre olarak verilir ve filtreden geçen eleman yine aynı şekilde yield ile geriye döndürülür.

Kullanım şeklide şu şekilde:

class Program
    {
        static void Main(string[] args)
        {
            Dukkan dukkan = new Dukkan();
            foreach (Urun u in dukkan.Filtrele(u => u.Ad.ToLower().StartsWith("m")))
            {
                Console.WriteLine(u.Ad);
            }
        }
    }

Şimdi de bir Say metodu yapalım ve bunu Ortalama bulmak için yazacağımız metot ile kullanalım.

public static class BizimEnumerable
    {       
        public static int Say<T>(this IEnumerable<T> source)
        {
            int toplam = 0;
            foreach (T obj in source)
            {
                toplam++;
            }
            return toplam;
        }
     }

Say metodunu kullanarak ortalamayı hesaplayalım.

public static class BizimEnumerable
    {
        public static double Ortalama<T>(this IEnumerable<T> source, Func<T, int> predicate)
        {
            int toplam = 0;
            foreach (T obj in source)
            {
                toplam += predicate(obj);
            }
            return toplam / source.Say();
        }
     }

Ekrana Yazdıralım bulduğumuz sonucu.

class Program
    {
        static void Main(string[] args)
        {
            Dukkan dukkan = new Dukkan();
            double sonuc = dukkan.Ortalama(u => u.Fiyat);
            Console.WriteLine("Kaynaktaki ürünlerin ortalam fiyatları : {0}", sonuc);
        }
    }

0 yorum:

Yorum Gönder