LINQ Keşifleri (1) - Koleksiyonları Sorgulamak

LINQ keşfine çıkıyoruz. İlk durağımız, koleksiyonları sorgulamak ya da LINQ To Objects.

.NET 3.5 ile programlama tarafına "gelen" en önemli yenilik budur efendim. [Gelmek eylemini neden vurguladığımı merak eder gibisiniz. Bırakın o tırnaklar, bu sefer izahatsız kalsın.]

LINQ, gerçekten acayip bir şey. Öncelikle açılımına bakalım: Language Integrated Query. İfâ ettiği vazifeyi adında taşıyor gördüğünüz gibi: dil ile bütünleşik sorgulama altyapısı.

Basit bir problemle başlayalım.

Elinizde sayılardan oluşan bir dizi var. Bunların arasından 3 ile bölünebilenleri istiyorum sizden. Bir program yazarak cevaplıyorsanız bu soruyu, ne yaparsınız?

Önce yeterli boyutta sahte diziyi tanımlarsınız:

int sayilar = new int[] {1,2,3,4,5,6,7,8,9,10};

Sonra mevlevîler gibi döne döne 3'e bölünebilmeyi test eder ve yazarsınız:

foreach (int sayi in sayilar)
{
if(sayi % 3 == 0)
Console.WriteLine(sayi + " ");
}

Klasik .NET kodlaması olarak cevabınız doğrudur. Hiçbirşey diyemeyiz. Hatta tebrik bile edebiliriz.

Amma velâkin sene 2007 olmuş, .NET dilleri yeni bir yetenek kazanmış. Bu yetenek, hepimizin âşina olduğu SQL benzeri sözdizimle nesneler üzerinde sorgulamalar yapmamıza imkan veriyor.

SQL deyince "select from falan fıstık" deriz ya gayri ihtiyari. İşte o "falan fıstık" kodumuz içerisinde bir nesne olsa ve biz ona hitâben select from vs. gibi şeyler desek?

İşte LINQ'nun meselesi bu.

Yukarıdaki cevabı bir de LINQ mahareti ile verelim. Kodu yazarken C# 3.5'un var anahtar kelimesi ile uygulanan "Type Inference" becerisine de bulaşmış olacağız, dikkatinizi çekerim:

var sayilar = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var uceBolunebilenSayilar = from sayi in sayilar
where (sayi % 3) == 0
select sayi;
foreach (var deger in uceBolunebilenSayilar) Console.WriteLine(deger);

Maşallah!

"select from" alışkanlığını C# kodu içerisinde kullanabilmek gerçekten nefis. Farkettiyseniz bir parça gariplik var sözdizimde. "Select" neden sonda meselâ? Hepsinin altında yatan bir hakikat var. "from" tanım deyimi olduğu için en başa alınmış ve "select" de deyimin sonunda yer bulmuş kendine.

Bu kod, ancak .NET 3.5 ortamlarında yazılabilecek bir kod. Denemek veya kullanmak için .NET 3.5 icrâ sistemi ve IDE olarak tercihen Visual Studio 2008 sürümlerinden birisi gerekiyor. Bedava dağıtılan Express sürümler bile işinizi fazlasıyla görür.

LINQ deyimleri ile System.Collections.Generic.IEnumerable ve jenerik System.Collections.Generic.IEnumerable tipindeki nesneleri muhatap alan sorgular yazabiliriz. Bu demek oluyor ki, diziler, koleksiyonlar, yapısal koleksiyonlar, vs. hepsi bu işe müsait.

Sırada bir sınıf tanımımız var:

public class Siparis
{
public int SiparisId { get; set; }
public int Adet { get; set; }
public int UrunId { get; set; }
public decimal Tutar { get; set; }
}

Lafa gerek yok, gereksiz bir sınıf. Şimdi bir sipariş listesi yapalım:

List sp = new List();
sp.Add(new Siparis { SiparisId = 1, Adet = 1, Tutar = 20M, UrunId = 5 });
sp.Add(new Siparis { SiparisId = 2, Adet = 5, Tutar = 45M, UrunId = 6 });
sp.Add(new Siparis { SiparisId = 3, Adet = 15, Tutar = 65M, UrunId = 9 });

Sipariş nesneleri oluştururken yine rahat durmayıp yeni dil becerilerinden tip hazırlayıcıları kullandık. Yalnız koleksiyon hazırlayıcı denen yeni beceriyi bilerek kullanmadık ki kendimizi affettirebilelim.

Ve beklediğiniz kısım: sorgulamak:

var netice = (from s in sp where s.SiparisId == 2 select s).First();
Console.WriteLine(netice.Tutar.ToString());>

Şu "var" kelimesi öyle bir şey ki, neyi ona atadıysanız, atadığınız şeyin tipini (derleme aşamasında) giyiyor. Koddaki sorgu deyiminden First() metodunu çağırdık ki tek bir nesne (ilk nesne) gelsin, yani Siparis. Eğer bu metodu işletmemiş olsaydık "netice" bir sipariş koleksiyonu oluverecekti.

Kim tutar sizi artık? Önceden veri tablolarına karşı çalıştırdığımız şu güzelim sorgulama dilini şimdi işimize gelen her noktada kullanabileceğiz ya da kullanıyor olacağız.

Siz de projelerinizde uygulamak için geç kalmayın.

LINQ ile kalın.

,

Arşivden

Yorum bulunmuyor.

Yorum yazabilirsiniz


* [b], [i] ve [quote] serbest