LINQ Yokken (Linq Serisi 1.1)

Apr 10, 20215 dakika

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 .











Küçük bir destek binlerce beğeniden daha değerlidir
Bylge Icon
Bylge Icon