C# 3.0 : LINQ (Language Integrated Query)
C# 3.0’la gelen bir diğer yenilik ise LINQ. Language Integrated Query komutları SQL sorgularına çok benzer. LINQ ile ister veritabanını sorgulayabiliriz, istersekte oluşturduğumuz koleksiyonları sorgulayabiliriz. Veritabanı sorgulayabilmek için DBML(Database Markup Language) uzantılı bir dosya oluşturulur. Veritabanı sistemi olarak SQL Server’a desteği vardır. Oluşturduğumuz bu DBML dosyasının kodlarına bakarsak aslında bir sınıftır. Yani biz bunu new anahtarıyla örnekleyerek bir nesne oluşturabiliriz. Normalde bu imkansız bir şeydi. Aynı şekilde koleksiyonlarımızıda sorgulayabiliriz. Bir int dizisi olduğunu düşünün. Bu dizinin içindeki elemanları sıralamak gerekiyor. Bunu yapabilmeniz için iç içe düngü kullanarak yapmak gerekirken artık LINQ ile SQL tarzı sorgular yazarak bu işi daha kolay ve performanslı bir şekilde yapabiliriz.
Şimdi bu konu hakkında bir örnek yapalım. Ben bu yazıda sadece koleksiyonları sorgulayacak bir LINQ projesi hazırlıycam. İkinci yazımda ise DLINQ yani veritabanını sorgulayacak LINQ projesi hazırlayacağım. Şimdi kodlarımızı yazalım :
int[] sayilar = new int[] { 1, 5, 9, 0, 3, 4, 5, 8, 7 };
var sorgu = from f in sayilar
orderby desc
select f;
foreach (string s in sorgu)
{Console.Writeline(s);
}
Console.Readline();
Burada ilk önce bir int tipinde dizi tanımladık. Daha sonra yine C# 3.0 ile gelen yeniliklerden biri olan var anahtar kelimesiyle isimsiz bir tip tanımladık. Bu sayede ilgili değişkenin tipini biz değil çalışma zamanında programlama dili ayarlayacak. Herhangi bir performans kaybı yaşanmayacaktır. Çünkü programlama dili var ile tanımlanmış bir değişkenin tipini program çalıştığı zaman hemen atayacaktır. Eğer object türünde tanımlasaydık boxing ve unboxing işlemine uğrayacağı için performans kaybına yol açacaktır. Şimdi sorgumuza bakalım. from f in sayilar kısmında f isminde geçici bir değişken oluşturup in anahtar kelimesinden sonra sorgulanacak koleksiyonu yazdık. Bir alt satırda ise SQL’den alışık olduğumuz order by ile sıralama işlemini yapıyoruz. desc anahtar kelimesi ile sondan başa doğru bir sıralama işlemi gerçeştiriyoruz. Bir alt satırda ise oluşturduğumuz geçici değişken olan f’yi seçiyoruz ve sorgumuz bitiyor. Daha sonra ise foreach döngüsü ile ekranda gösteriyoruz.
Add comment 15 Temmuz 2008
C# 3.0 : Lambda İfadeleri
C# 3.0 ile gelen en büyük yeniliklerden biri Lambda İfadeleridir. Lambda ifadeleriyle temsilci tipi parametre alan metotları daha kısa bir biçimde yazabiliriz. Şimdi bu konuyu anlamak için C# 1.1, 2.0 ve 3.0 versiyonlarıyla yapacağım.
C# 1.1
List<int> listem = new List<int>();
listem.Add(1);
listem.Add(2);
listem.Add(3);
listem.Add(4);
listem.Add(5);
listem.Add(6);
Predicate<int> pre = new Predicate<int>(KararVer);
List<int> CiftSayi = listem.FindAll(pre);
foreach(int i in CiftSayi)
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
bool KararVer(int Deger)
{
return Deger % 2 == 0;
}
Gördüğünüz gibi çok uzun bir kod bloğu oluştu. İlk önce listem adında List<int> tipinde bir nesne oluşturduk. Bunun içine Add() metoduyla int tipinde değerler girdir. Daha sonra yine List<int> int tipinde bir tane daha nesne oluştursuk ve buna değer olarak listem.FindAll() metodunu atadık. Listem.FindAll metodu Predicate<T> tipinde bir temsilciyi parametre olarak alıyor. Oradaki Predicate<int>(KararVer) kısmı ile bool değer döndüren bir parametre alıyor. Bizde buraya bir tane KararVer isminde metodu gösterdik. Foreach döngüsüylede verileri ekranda gösterdik. Şimdi KararVer() metodumuza bakalım. KararVer metodu bool tipinde bir değer döndüren, int tipinde bir parametre alan metodumuz. Kod bloğunda ise Deger parametersinin 2’ye tam bölünüp bölünmediğini kontrol ettirerek geriye bool tipinde bir değer döndürüyoruz. Şimdi bunu C# 2.0 ile yapalım.
C# 2.0
List<int> listem = new List<int>();
listem.Add(1);
listem.Add(2);
listem.Add(3);
listem.Add(4);
listem.Add(5);
listem.Add(6);
List<int> CiftSayi = listem.FindAll(delegate(int deger) { return deger % 2 == 0;});
foreach(int i in CiftSayi)
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
Burada ise artık Predicate şablon sınıfında kurtulduk. FindAll metodunda ise C# 2.0 ile beraber gelen isimsiz metodları kullanarak çok basit bir biçimde geriye değer döndürdük. Şimdi ise C# 3.0 ile yapalım.
C# 3.0
List<int> listem = new List<int>();
listem.Add(1);
listem.Add(2);
listem.Add(3);
listem.Add(4);
listem.Add(5);
listem.Add(6);
List<int> CiftSayi = listem.FindAll(deger => deger % 2 == 0);
foreach(int i in CiftSayi)
{
Console.WriteLine(i.ToString());
}
Console.ReadLine();
Burada ise lambda(=>) ifadelerini kullanarak çok basit bir biçimde temsilci tanımlayarak geriye bool tipinde deger gönderen bir yapı oluşturduk.
Add comment 15 Temmuz 2008