30 Nisan 2011 Cumartesi

C#`ta döngüsüz arama. Tek satırlık ninja yolu.

Geçen defa metin döngü kullanmadan nasıl ters çevrilir anlattığımda, döngüsüz aramanı anlatacağımı söz vermişdim. C#`ta döngüsüz aramak için yine System.Linq namespace`inin Extension Method`larına baş vuracağız. Onların arasında FirstOrDefault metodu (msdn) döngüsüz aramanı sağlıyor.

En basit şekilde böyle kullanılır:

string[] names = { "Hartono", "Adams", "Andersen", "Hedlund", "Ito" };
string aranilan = "Adams";
 
// Ninja yolu, tek satırda ve döngüsüz arama.
string foundName = names.FirstOrDefault(name => name == aranilan);
// Okunuşu: names`de öyle bir name ki, => o name == aranilan.
Bu kod aşağıdakılara denktir:
string foundName = null;
 
// Normalde böyle ararız:
for(int i=0; i<names.Length; i++)
    if( names[i] == aranilan ) 
        foundName = names[i];
 
// Ya da böyle:
foreach(string name in names)
    if( name==aranilan )
        foundName = name;
 
// Çıkışta, foundName==null ise, bulunmadı; değilse, aranilan-bulunan ismi içerir


FirstOrDefault`takı ‘name => name == aranilan’ ne demek diye kafanız karışabilir, onu şimdi anlatacağım.
Anlamak için, foreach`a bakın önce. Ordakı ‘string name in names’ ve ‘names.FirstOrDefault(name => name==aranilan)‘ parçasında altını çizdiğim yerler denktir. ‘name==aranilan’ ise if’in controlüne denk geliyor. Bu şekilde anlarsınız, kullanmaya yeter. Aklınızda tutun ki, ‘=>’ ile ‘)’ arasında bir bool ifade olmalı, aynı if`in içindeki gibi. (uzunluğu 7`den büyük olan ilk ismi seçmek için ‘name => name.Length>20)’ yazabiliriz.)
Aslında nasıl olduğunu bilmek istiyorsanız, Lambda Expressions (lambda ifadeler) konusuna bakmak gerek. Belki ilerde onu anlatırım.

DİKKAT: Eğer dizide aranan değer yoksa, dizideki veri tipinin default değeri döner. Yani, int dizisinde aradığımız sayı yoksa, sıfır döner. String dizisi için null döner. Default değerler tablosuna msdn`de bakabilrisiniz. Hatırlayın ki, referance tipler üçün default değer null olur.

Bir adım geri: FirstOrDefault C#`ta bir overload`a sahip – parametresiz kullanılabiliyor. Parametresiz kullanıldığında bir dizinin boş-olup olmamasının kontrolünü gerçekleştirir: boş değilse ilk elemanını, boş ise tipin default değerini dönderir.
Yani, parametresiz FirstOrDefault-un dahili kodu bunun gibidir (string dizisi için örnek):

public static string OrnekFirstOrDefault(string[] dizi){
    if(dizi.Length>0)
        return dizi[0];
    else
        return null;
}
/*
 Dikkat: 
  Parametre olarak gönderilen dizi 'names.FirstOrDefault()' yaptığımızda olan names`dır
  Yani, names.FirstOrDefault() <=> OrnekFirstOrDefault(names).
*/
 

 

if( names.FirstOrDefault(i => i=="Mehmet") == null )
    Console.WriteLine("Mehmet yokmuş.");

Hiç yorum yok:

Yorum Gönder