bylge-logo

    Bylge

    LINQ Yokken (Linq Serisi 1.1)

    Bir önceki yazımda Linq'nun ne olduğundan bahsetmiştim ve bir giriş yapmıştım. Bu yazıyı okumadan önce muhakkak onu okuyunuz. Buraya tıklayarak Linq'a giriş ya

    Picture of the inadınayazar

    inadınayazar

    @matul

    Bir önceki yazımda Linq'nun ne olduğundan bahsetmiştim ve bir giriş yapmıştım. Bu yazıyı okumadan önce muhakkak onu okuyunuz.


    Buraya tıklayarak Linq'a giriş yapmış olduğum yazıya gidebilirsiniz.



    Linq'nun olmadığını düşünelim.Elimizde Öğrenci Tipinde bir dizi var ve bu dizi içerisindeki 12 yaşından büyük 20 yaşından küçük öğrencileri bulmak istediğimizi varsayalım.Bunu yapmak için ilk akla gelen bir döngü vasıtasıyla dizimizin elemanlarını teker teker dolaşıp bu elemanların istediğimiz koşula uygun olup olmadığını belirlemek için kullanacağımız bir if bloğu vasıtasıyla filtreleme yapabiliriz zaten eskiden de böyle yapılıyordu.


    class Ogrenci

    {

    public int OgrenciID{ get; set; }

    public String OgrenciAdi{ get; set; }

    public int Yas{ get; set; }

    }


    class Program

    {

    static void Main(string[] args)

    {

    Ogrenci[] OgrenciArrayi= {

    new Ogrenci() { OgrenciID= 1, OgrenciAdi= "John", Yas= 18 },

    new Ogrenci() { OgrenciID= 2, OgrenciAdi= "Steve", Yas= 21 },

    new Ogrenci() { OgrenciID= 3, OgrenciAdi= "Bill", Yas= 25 },

    new Ogrenci() { OgrenciID= 4, OgrenciAdi = "Ram" , Yas= 20 },

    new Ogrenci() { OgrenciID= 5, OgrenciAdi= "Ron" , Yas= 31 },

    new Ogrenci() { OgrenciID= 6, OgrenciAdi= "Chris", Yas= 17 },

    new Ogrenci() { OgrenciID= 7, OgrenciAdi= "Rob",Yas= 19 },

    };


    Ogrenci[] ogrenciler= new Ogrenci[10];


    int i = 0;


    foreach (Ogrenci ogr in OgrenciArrayi)

    {

    if (ogr .Yas> 12 && ogr .Yas< 20)

    {

    ogrenciler[i] = ogr ;

    i++;

    }

    }

    }

    }


    Kodumuz bu şekilde olacaktır fakat elimizdeki OgrenciArrayi üzerinde programımızın farklı yerlerinde farklı filtrelemelere ihtiyaç duyacağımızı düşünün. Her seferinde bir döngü kullanmak bu kodu spagetti koda çevirir. Ne bakımı kolay olur ne de Okunabilir.


    Bu tür bir durumun üstesinden gelmek için C# 2.0 da delegeler tanıtıldı. Gelin Bir delege ile işlerin ne kadar kolaylaştığını görelim.


    delegate bool OgrenciBul(Student std);


    class OgrenciFiltrele

    {

    public static Ogrenci[] filtrele(Ogrenci[] ogrArray, OgrenciBul del)

    {

    int i=0;

    Ogrenci[] sonuc= new Ogrenci[10];

    foreach (Ogrenci ogr in ogrArray)

    if (del(ogr))

    {

    sonuc[i] = ogr;

    i++;

    }


    return sonuc;

    }

    }


    class Program

    {

    static void Main(string[] args)

    {

    Ogrenci[] ogrenciArray = {

    new Ogrenci() { OgrenciID= 1, OgrenciAdi= "John", Yas= 18 } ,

    new Ogrenci() { OgrenciID= 2, OgrenciAdi= "Steve", Yas= 21 } ,

    new Ogrenci() { OgrenciID= 3, OgrenciAdi= "Bill", Yas= 25 } ,

    new Ogrenci() { OgrenciID= 4, OgrenciAdi= "Ram" , Yas= 20 } ,

    new Ogrenci() { OgrenciID= 5, OgrenciAdi= "Ron" , Yas= 31 } ,

    new Ogrenci() { OgrenciID= 6, OgrenciAdi= "Chris", Yas= 17 } ,

    new Ogrenci() { OgrenciID= 7, OgrenciAdi= "Rob",Yas= 19 } ,

    };


    Ogrennci[] students = OgrenciFiltrele.filtrele(ogrenciArray, delegate(Ogrenci ogr){

    return ogr.Yas> 12 && ogr.Yas < 20;

    });

    }

    }

    }


    Kodu incelersek bool türünde değer döndüren Ogrenci tipinde argüman alan metodu tutması için bir delege , OgrenciFiltrele adında bir sınıf ve bu sınıfın içerisinde filtrele adında static bir metod tanımladık.Metodu inceleyecek olursak,metodumuz Ogrenci tipinde bir dizi ve Ogrenci bul tipinde bir delege alıyor aldığı Ogrenci dizisini foreach ile geziyor gezerken ona gönderdiğimiz metodu if deyiminin şartı şeklinde kullanıyor ve sonuc adlı dizimize filtrelenmiş Ogrencileri atıyor.


    Bunun asıl avantajı biz eğer başka bir filtreleme daha yapmak istersek tekrar tekrar döngü yazmak yerine OgrenciFiltrele Sınıfı içerisindeki filtrele metoduna dizimizi ve istediğimiz koşulu göndererek kod tekrarının önüne geçmiş olacağız.


    Örnek olarak:


    Ogrenci[] Ogrenciler= OgrenciFiltrele.filtrele(OgrenciArray, delegate(Ogrenci ogr) {

    return ogr.OgrenciID== 5;

    });



    Ogrenci[] students = OgrenciFiltrele.filtrele(OgrenciArray, delegate(Ogrenci ogr) {

    return ogr.OgrenciAdi== "Bill";

    });


    Fakat hala kodun biraz daha iyileştirilmesi gerekiyordu. C# Mühendisleri bunu farkettiler ve LINQ, C# 3.0 ile beraber hayatımıza girmiş oldu.


    Aşağıdaki kod bloğunda Linq nun Ogrenci dizisindeki Öğrencileri nasıl filtrelediğini görebilirsiniz.


    class Program

    {

    static void Main(string[] args)

    {

    Ogrenci[] ogrenciArray = {

    new Ogrenci() { OgrenciID= 1, OgrenciAdi= "John", Yas= 18 } ,

    new Ogrenci() { OgrenciID= 2, OgrenciAdi= "Steve", Yas= 21 } ,

    new Ogrenci() { OgrenciID= 3, OgrenciAdi= "Bill", Yas= 25 } ,

    new Ogrenci() { OgrenciID= 4, OgrenciAdi= "Ram" , Yas= 20 } ,

    new Ogrenci() { OgrenciID= 5, OgrenciAdi= "Ron" , Yas= 31 } ,

    new Ogrenci() { OgrenciID= 6, OgrenciAdi= "Chris", Yas= 17 } ,

    new Ogrenci() { OgrenciID= 7, OgrenciAdi= "Rob",Yas= 19 } ,

    };



    Ogrenci[] gencOgrenciler= ogrenciArray .Where(s => s.Yas> 12 && s.Yas< 20).ToArray();



    Ogrenci billOgrenci= ogrenciArray.Where(s => s.OgrenciAdi== "Bill").FirstOrDefault();



    Ogrenci 5numaralıOgrenci= ogrenciArray.Where(s => s.OgrenciAdi== 5).FirstOrDefault();

    }

    }


    Yukarıdaki örnekte de görüleceği üzere Linq kodumuzu daha anlaşılır hale getirdi.Ayrıca Linq ilk makalede de belirttiğimiz gibi sadece arrayleri değil farklı bir çok veri kaynağını filtrelemek içinde kullanılır.


    Bir sonraki yazımda ise Linq hangi nesneler üzerinde kullanılabilir buna detaylı bir şekilde bakacağız .


    LINQ_Yokken_(Linq_Serisi_1.1)





    Published Date:

    April 10, 2021

    Updated Date:

    December 02, 2023