Single,SingleOrDefault ve First,FirstOrDefault Farkı

Yine ve yine bu sabah bu metodlar arasındaki farkı birazcık karıştırmış olduğum için sorun ile karşılaştım. Karşılaştığım bu sorun ise güzel bir şeye vesile oldu ve bu yazıyı yazdım. Hiçbir fikriniz yok ise öğrenmenize vesile olmasını temenni ederim. Zaten biliyor ve konuya hakimseniz; pekişmesini temenni ederim. 🙂

LİNQ sorgularında seçim yapılırken First,FirstOrDefault, Single ve SingleOrDefault metodlarına sıklıkla başvuruyoruz. Bu metodları kullanırken doğru kullanım olmadığı zamanlarda sorunlar ile karşılaşabiliriz. Bu metodlar arasındaki farkı tam anlamı ile bildiğimiz takdirde bu sorunlardan kurtulmuş oluruz. 



 Single ve SingleOrDefault Metodu
 

SingleOrDefault 
 

Çift rakamları içeren int tipinde bir dizimiz olsun. Bu dizinden herhangi bir çift sayı seçilmek istendiğinde Single ve SingleOrDefault metodlarından birini kullanabiliriz.
 
 SingleOrDefault kullanılacaksa;
 
Dizi içerisinden sadece bir tane çift sayı seçilmek isteniyor ve seçim şartımız sağlanmıyorsa, bu durumda int tipinin varsayılan değeri olan 0(sıfır) döndürülmesi sağlanacak ise SingleOrDefault seçimininin kullanılması gerekir.

int [] evenNumbers = {0,2,4,6,8}
 
 int number = evenNumbers.SingleOrDefault(n=> n.Equals(1));

Console.WriteLine(number);

Dizi içerisinde 1 değeri olmadığı için program çıktısı 0 döndürecektir.
 

Eğer ;

int number = evenNumbers.SingleOrDefault(n=> n>2);

Console.WriteLine(number);

Bu sorguda ise sonuç 2’den büyük olan birden fazla eleman vardır. Birden fazla değer döndüğü için InvalidOperationException hatası verecektir.

Single
 
Eğer seçimimiz sonucunda sadece bir tane eleman geleceği garanti ise bu durumda Single kullanılabilir. Eğer şart sonucunda; hiçbir eleman dönmez ise veya şartı sağlayan birden falza eleman dönerse; bu durumda hata ile karşılaşılacaktır.

int [] evenNumbers = {0,2,4,6,8}
 
int number = evenNumbers.Single (n=> n.Equals(2));

Console.WriteLine(number);

Yukarıdaki örnekte şart sağlandığı için çıktı olarak “2” dönecektir.

int [] evenNumbers = {0,2,4,6,8}
 
int number = evenNumbers.Single (n=> n.Equals(1));

Console.WriteLine(number);

Yukarıdaki örnekte ise 1’e eşit herhangi bir eleman olmadığı için InvalidOperationException istinası fırlatılacaktır.

FirstOrDefault ve First
 

FirstOrDefault: Bu seçimde de mantık SingleOrDefault ile aynıdır. Ancak seçimde ilk eleman seçilir. Yani eğer dizide 2den büyük bir sayı seçilecekse; bu elemanda 2 den büyük “ilk” eleman seçilir.

First: Mantık Single ile aynıdır. Ancak ilk elaman seçilir

int [] evenNumbers = {0,2,4,6,8}
 
int number = 0;

number = evenNumbers.FirstOrDefault(n => n > 8); // Sonuç: 0 ( Çünkü 8’den büyük bir eleman olmadığı için bulamadı ve ilk elemanı alamadı.)

number = evenNumbers.FirstOrDefault(n => n == 2); // Sonuç: 2 ( Çünkü 2’e eşit olan elemanın buldu ve çıktıya yazdı.)

number = evenNumbers.First(n => n == 4); // Sonuç: 4
 ( Çünkü 4’e eşit olan elemanı buldu ve çıktıya yazdı.)

number = evenNumbers.First(n => n > 3); // Sonuç: 4 (3’ten büyük elemanı buldu ve sıradakini yazdı.)

Kaynakça:
https://www.bayramucuncu.com/single-singleordefault-ve-first-firstordefault-farki/

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir