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.
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