delegate, Func<T>, Predicate<T> , LinQ ifadeleri

Merhaba, LinQ teknolojisi c# 3.0 ile gelen bir teknolojidir. Bu teknoloji ile uzatılmış methodlar ile tanışmık olduk.  Func<T>, Predicate<T> gibi delegeler yine bizim linq ile gelmiştir. Ben yine sıfırdan başlayacağım. Func<T>, Func<T,TResult> gibi 15, 16 adet çeşidi bulunmaktadır.

http://msdn.microsoft.com/en-us/library/yxcx7skw.aspx bu linkden bu tipleri görebilrisiniz.

namespace delegateAnonimMethodlar
{
    delegate  int delegem(int sayi);
    class Program
    {
        static void Main(string[] args)
        {
            delegem islemyap = new delegem(kub);

           Console.WriteLine(islemyap.Invoke(5));
        }

        static int kub(int sayi)
        {
            return sayi * sayi * sayi;
        }
    }
}

Şimdide aynı kodu AnonysMethod kullanarak yapalım. (İsimsiz yöntemler). İsimsiz methodlar sadece bir iki defa kullanılacak yerlerde kullanılabilir.

namespace delegateAnonimMethodlar
{
    delegate  int delegem(int sayi);
    class Program
    {
        static void Main(string[] args)
        {
            delegem islemyap = delegate(int sayi)
                {
                    return sayi*sayi*sayi;
                };

           Console.WriteLine(islemyap.Invoke(5));
        }
    }
}

Şimdide lambada operatörü kullanarak yapalım..

namespace delegateAnonimMethodlar
{
    delegate  int delegem(int sayi);
    class Program
    {
        static void Main(string[] args)
        {
            delegem islemyap = (sayi)=>sayi*sayi*sayi;
           Console.WriteLine(islemyap.Invoke(5));
        }
    }
}

Şimdi bir sayı dizisinden FindAll methodunu kullanarak  dörde bölünensayıları çekelim.  

namespace delegateAnonimMethodlar
{
    class Program
    {
        static void Main(string[] args)
        {
            var sayilar = new List<int> { 2, 4, 5, 6, 98, 76, 45, 32, 45 };
            var bulunanlar=sayilar.FindAll(bul);
            
            foreach (var item in bulunanlar)
	        {
                Console.WriteLine(item);
	        }
        }
        static bool bul(int sayi)
        {
            return sayi % 4 == 0;
        }
    }
}

Şimdide lambada ifadesiyle aynı işlemi yapalım..

namespace delegateAnonimMethodlar
{
    class Program
    {
        static void Main(string[] args)
        {
            var sayilar = new List<int> { 2, 4, 5, 6, 98, 76, 45, 32, 45 };
            var bulunanlar=sayilar.FindAll(x=>x%4==0);
            
            foreach (var item in bulunanlar)
	        {
                Console.WriteLine(item);
	        }
        }
    }
}

Şimdide linq da kullanılan, where  genişletilmiş metodu ile  Func<> deyimini kullanarak sorgu yazalım.. Func deyiminin farkı birden fazla parametre geçirmemizdir.

static void Main(string[] args)
        {
            var sayilar = new List<int> { 2, 4, 5, 6, 98, 76, 45, 32, 45 };
            var bulunanlar = sayilar.Where(bul);
            
            foreach (var item in bulunanlar)
	        {
                Console.WriteLine(item);
	        }
        }
        static bool bul(int s)
        {
            return s > 10;
        }

Tabii bu ornekde bir parametre kullanıldığı için ve dönüş değeri bool olduğu için  Predicate<> deyiminden pek farkı olmayacak. Tabii örneği kısaltarak yamak çok oğrıu olacaktır.

static void Main(string[] args)
        {
            var sayilar = new List<int> { 2, 4, 5, 6, 98, 76, 45, 32, 45 };
            var bulunanlar = sayilar.Where(s=>s>10);
            
            foreach (var item in bulunanlar)
	        {
                Console.WriteLine(item);
	        }
        }

Bir Örnek daha yapalım..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace delegateAnonimMethodlar
{
    class Program
    {
           public static void Main()
           {
              Random rnd = new Random();
              var sepet = new List<Urun>();
              sepet.AddRange( new Urun[] { new Urun(1,"elma",12), 
                                                 new Urun(2,"armut",20),
                                                 new Urun(3,"portakala",30),
                                                 new Urun(4,"ayva", 10),
                                                 new Urun(5,"muz",5) } );
              int[] fiyat = { 10, 20, 30, 40 };
              int bul = fiyat[rnd.Next(0, fiyat.Length)];
              Console.WriteLine("Rastgele üretilen fiyat {0}:", bul);
              foreach (var item in sepet.FindAll( x => x.Fiyat  <= bul))
                 Console.WriteLine("{0}: {1}", item.Name, item.Fiyat);
           }
    }
    class Urun
    {
        public Urun(int id, string ad, int fiyat)
        {
            Id=id;Name=ad;Fiyat=fiyat;
        }
        public int Id {get; set; }
        public string Name {get;set; }
        public int Fiyat { get ; set; }
    }
 }

Şimdide msdn.com dan bir örnek ile açıklayalım. Burada point bir struct dır.

using System;
using System.Drawing;

public class Example
{
   public static void Main()
   {
      // Create an array of Point structures.
      Point[] points = { new Point(100, 200), 
                         new Point(150, 250), new Point(250, 375), 
                         new Point(275, 395), new Point(295, 450) };

      // Find the first Point structure for which X times Y   
      // is greater than 100000. 
      Point first = Array.Find(points, x => x.X * x.Y > 100000 );

      // Display the first structure found.
      Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
   }
}
// The example displays the following output: 
//        Found: X = 275, Y = 395

Bir sonraki yazımda görüşmek üzeri hoşçakalın.

 

Delegate, Lambada operatörü ve isimsiz(Anonymous) methodlar

Temsilciler bir veya birden fazla methodu referans gosteren tiplerdir.(type). Temsilciler metodu çalışma zamanında işaret edebilir, parametre yollayabilir, geri dönüşdeğerlerinide verebilriler ve hangi method veya methodların  çağrılacağını karar verebilirler. Biz tanımlama yaparken method ismi yerine bir kod blogu yazabiliriz. Bu kod bloklarına isimsiz(Anonymous) methodlar denir. Lambada deyimiyle de bu bir methodun referansını bir temsilciye aktarabiliriz.

 

using System;

namespace Temsilciler
{
    delegate int  temsilci(int a);
    delegate int temcilci2(int a, int b);
    delegate void temcilci3();
    class Program
    {
        
        static void Main(string[] args)
        {
            Hesap hesapla = new Hesap(5);
            temsilci bul = new temsilci(hesapla.karesi);
           // hesapla.Yaz(bul);
            bul += hesapla.kupu; //karesine bulan method eklenir. Fakat 25 değerinin üzerine 125 değeri yazıldığı için 25 rakamını yazmaz.

            hesapla.Yaz(bul);

            bul = x => (x * 8);//lambada deyimini kullandım. sonuc /40
            hesapla.Yaz(bul);


            temsilci bul1 = new temsilci(x=>(x*7));// ikinci yeni bir temsilci sonuc 35
            hesapla.Yaz(bul1);

            temcilci2 tem = (x, y) => x + y * 10;
            hesapla.Yaz(tem);//burada x=5 ve y=6 değerlerini methoddan alarak lambada deyimiyle kullanmayım.

            temcilci3 dene = new temcilci3(delegate() { Console.WriteLine("isimsiz method"); });
            dene += delegate() { Console.WriteLine("isimsiz method 2"); };//temsilcime yeni bir isimsiz (Anonymous) method ekledim.
            dene();
        }
    }

    class Hesap
    { 

        public Hesap(int sayi)
        {
            this.sayi = sayi;
        }
        public  int sayi;
       

        public int  karesi(int a)
        {
            Console.WriteLine("karesi çalıştı");
            return a * a;
        }
        public int kupu(int a)
        {
            Console.WriteLine("Kupu çalıştı:");
            return a * a * a;
        }

        //parametre bir metod;
        public void Yaz(temsilci bulunacak)
        {
            Console.WriteLine(bulunacak(sayi));
        }

        public void Yaz(temcilci2 bulunacak)
        {
            Console.WriteLine(bulunacak(5,6));
        }

    }
}

Sanırım tüm konuyu anlatan güzel bir örnek. 

 

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.