Google Analytics İzleme

30 Temmuz 2010

Linq SingleOrDefault ve FirstOrDefault

Linq kullanırken tek bir eleman çektiğimiz zaman hem first hemde single olması kafa karıştırıcı değil mi ? Aslında buna verilen cevap "birisi ilk eleman birisi tek eleman" şeklinde olur. Aslında bu tanım yeterince açıklayıcı ama ben biraz daha detaya inerek anlatmak istedim.

Öncelikle bilmeniz gereken şu :
Single : Tek bir eleman döndürdüğünden emin olduğunuz sorgular için kullanın, eğer sorgu birden fazla eleman döndürecek olursa hata oluşacaktır.
SingleOrDefault : Hiç eleman dönmez ise generic tipin varsayılan değerini ya da nothing değeri dönecektir. Yine birden fazla değer varsa hata verir.
First : Dönen sorgu sonucunun ilk elemanını döndürecektir. Bu tek bir string ise char dizisi olarak kabul edilip ilk karakteri alınır.
FirstOrDefault : Hiç eleman dönmez ise generic tipin varsayılan değerini ya da nothing değeri dönecektir.

biraz daha detaya inecek olursak

first fonksiyonu çalışırken şu adımları izler:

  1. Tampon bir list , sonuç kümesi (IEnumerable) ile doldurulur
  2. Tampon listenin Nothing olup olmadığına bakılır
    • Nothing değil ise :Tampon listenin ilk elemanı 0 index numarası çağırılarak gönderilir
    • Nothing ise : Bu küme list'e aktarılamıyordur bu yüzden bir IEnumerator nesnesine gönderilir ve bir sonraki kayıt alınmaya çalışılır.
  3. Eğer hala bir şey döndürülmemiş ise first için bir kayıt yok hatası,FirstOrDefault için ise nothing döndürülür.

birde single a bakalım :

  1. Tampon bir list , sonuç kümesi (IEnumerable) ile doldurulur
  2. Tampon listenin Nothing olup olmadığına bakılır
    • Nothing değil ise Listenin eleman sayısına bakılır :
      • 0 ise eleman yok  hatası.
      • 1 ise listenin 0 index numaralı elemanı döndürülür
    • Nothing ise Bu küme list'e aktarılamıyordur bu yüzden bir IEnumerator nesnesine gönderilir
      • bir sonraki kayıt alınamıyorsa kayıt yok hatası döndürülür
      • bir sonraki kayıt tampon bir değişkene alınır
      • bir sonraki kayıt alınamıyorsa alınan tampon sonuç olarak döndürülür
  3. Eğer hala bir şey döndürülmemiş ise first için bir kayıt yok hatası,SingleOrDefault için ise nothing döndürülür.

görüldüğü üzere single'ın performans için bir faydası yok, hatta fazladan bir kaç karşılaştıma yapılmakta. Eğer tek kayıt dönmesi gereken bir sorgudan birden fazla dönmesini yakalamak istediğiniz bir durum olursa kolaylıkla try bloğu içerisind tanımlayabilirsiniz.Ama birden fazla da dönse ilk kayıt sizin için yeterli oluyorsa First / FirstOrDefault kullanın.

not: .net fonksiyonlarının işleyişlerini görebilmek  için reflector programını kullanabilirsiniz.

Alıntı: http://www.cihanyakar.com/?p=213


1 yorum:

esilüet.com dedi ki...

Çok faydalı bilgilerdi... Teşekkürler.