SingleOrDefault ve FirstOrDefault Farkı

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:

Tampon bir list , sonuç kümesi (IEnumerable) ile doldurulur

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.

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 :

Tampon bir list , sonuç kümesi (IEnumerable) ile doldurulur

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

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: http://www.cihanyakar.com/?p=213  alıntıdır.

Add comment

The file '/Custom/Widgets/Calendar/widget.cshtml' does not exist.The file '/Custom/Widgets/Category list/widget.cshtml' does not exist.The file '/Custom/Widgets/Tag cloud/widget.cshtml' does not exist.The file '/Custom/Widgets/Page List/widget.cshtml' does not exist.The file '/Custom/Widgets/Month List/widget.cshtml' does not exist.