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.