Single,SingleOrDefault ve First,FirstOrDefault Farkı
Bu sabah bu metodlar arasındaki farkı karıştırdığımı fark ettim ve bu da beni bir sorunla karşılaştırdı. Ancak bu sorun, bu yazıyı yazmama vesile oldu. Eğer konu hakkında bilginiz yoksa, umarım yeni bir şey öğrenmenizi sağlarım. Eğer bilginiz varsa da bilgilerinizi pekiştirmenizi temenni ederim. 😊
LINQ sorgularında seçim yapılırken sıklıkla First
, FirstOrDefault
, Single
ve SingleOrDefault
metodlarına başvuruyoruz. Bu metodları doğru şekilde kullanmadığımız takdirde bazı hatalarla karşılaşabiliriz. Metodlar arasındaki farkları iyi bildiğimizde bu tür sorunlardan kaçınabiliriz.
Single ve SingleOrDefault Metodları
SingleOrDefault
Çift sayıları içeren bir int
dizimiz olduğunu düşünelim. Bu diziden herhangi bir çift sayı seçmek istediğimizde Single
veya SingleOrDefault
metodlarından birini kullanabiliriz.
Eğer SingleOrDefault
kullanılacaksa:
Dizi içerisinden sadece bir tane çift sayı seçilmek isteniyor ve seçim şartı sağlanmıyorsa, bu durumda int
tipinin varsayılan değeri olan 0
dönecektir. SingleOrDefault
seçimi için örnek kod:
codeint[] evenNumbers = {0, 2, 4, 6, 8};
int number = evenNumbers.SingleOrDefault(n => n.Equals(1));
Console.WriteLine(number); // Çıktı: 0 (Dizide 1 olmadığı için varsayılan değer döndü.)
Eğer şöyle bir seçim yaparsak:
codeint number = evenNumbers.SingleOrDefault(n => n > 2);
Console.WriteLine(number);
Bu sorguda 2
‘den büyük birden fazla eleman olduğundan, InvalidOperationException
hatası verecektir.
Single
Eğer seçimin sonucunda yalnızca bir eleman geleceği garanti ise Single
kullanılabilir. Eğer şart sonucunda hiçbir eleman dönmezse veya birden fazla eleman dönerse hata oluşacaktır.
codeint[] evenNumbers = {0, 2, 4, 6, 8};
int number = evenNumbers.Single(n => n.Equals(2));
Console.WriteLine(number); // Çıktı: 2
Ancak şu örnekte:
codeint number = evenNumbers.Single(n => n.Equals(1));
Console.WriteLine(number);
1’e eşit bir eleman olmadığı için InvalidOperationException
hatası alınacaktır.
FirstOrDefault ve First Metodları
FirstOrDefault
Bu metotta da mantık SingleOrDefault
ile aynıdır ancak burada seçimde ilk eleman döndürülür. Yani dizide 2
‘den büyük bir sayı seçilecekse, 2
‘den büyük ilk eleman dönecektir.
First
Single
metoduna benzer bir mantık izler; ancak ilk elemanı döndürür.
codeint[] evenNumbers = {0, 2, 4, 6, 8};
int number = 0;
number = evenNumbers.FirstOrDefault(n => n > 8); // Çıktı: 0 (8'den büyük eleman olmadığı için varsayılan değer döndü.)
number = evenNumbers.FirstOrDefault(n => n == 2); // Çıktı: 2 (Dizide 2'ye eşit eleman bulundu.)
number = evenNumbers.First(n => n == 4); // Çıktı: 4 (Dizide 4'e eşit eleman bulundu.)
number = evenNumbers.First(n => n > 3); // Çıktı: 4 (3'ten büyük ilk eleman bulundu.)
Kaynakça
Bayram Üçüncü – Single, SingleOrDefault ve First, FirstOrDefault Farkı