C# Linq SingleOrDefault Kullanımı

C# programlama dilinde, Linq bileşeni içindeki SingleOrDefault() , Single() metodu ile benzer şekilde çalışır yani koleksiyondaki belirli bir koşulu karşılayan tek öğeyi döndürür.

Single() metodundan farkı, koşul hiçbir öğe döndürmezse hata vermez. Referans türü için NULL, değer türü için ilgili varsayılan değeri döndür.

SingleOrDefault() metodunda koşul birden fazla kayıt döndürürse aşağıdaki hatayı alırsınız.

Sequence contains more than one matching element
"Sıra birden fazla eşleşen öğe içeriyor"

Aşağıdaki örneği inceleyelim..

İlk olarak koleksiyonumuzun (collection) oluşturulduğu Ogrenci ve Sinif class larımızı hazırlayalım.

class Ogrenci 
{
        public int Id { get; set; }
        public string Ad { get; set; }
}

class Sinif 
{
        public readonly List ogrenciler;
        public Sinif() 
        {
            this.ogrenciler = OgrenciYarat().ToList();
        }

        private IEnumerable OgrenciYarat()
        {
            yield return new Ogrenci { Id = 1, Ad = "Ali" };
            yield return new Ogrenci { Id = 2, Ad = "Erdem" };
            yield return new Ogrenci { Id = 3, Ad = "Ayşe" };
            yield return new Ogrenci { Id = 4, Ad = "Lale" };
            yield return new Ogrenci { Id = 5, Ad = "Gül" };
            yield return new Ogrenci { Id = 6, Ad = "Osman" };
            yield return new Ogrenci { Id = 7, Ad = "Irmak" };
            yield return new Ogrenci { Id = 8, Ad = "Tarık" };
        }
}

Oluşturulan sınıflarımızla birlikte SingleOrDefault() metodumuzu çeşitli örneklerde kullanalım.

Sinif sinif = new Sinif();
var kayit = sinif.ogrenciler.SingleOrDefault(x => x.Ad == "Rihanna");
var kayit2 = sinif.ogrenciler.Single(x => x.Ad == "Rihanna");    

İlk olarak "kayit" değişkenimizde SingleOrDefault() metodunu kullanarak adı "Rihanna" koşulunu sağlayan bir kayıt aradık. Böyle bir kayıt olmadığı için sonuç bize NULL döndü ve hata almadık.

Sonrasında "kayit2" değişkenimize Single() metodunu kullanarak aynı koşulu sağlayan bir kayıt atamaya çalıştık. Bu sefer, gene var olmayan bu kayıdı atamaya çalıştığından hata aldık.

Sequence contains no matching element
Sıra eşleşen öğe içermiyor

Not : Eğer getireceğiniz sonucun tek bir kayıt olacağından eminseniz (örneğin bir tablonun birincil anahtarı gibi) Single() metodunu kullanmanız, emin değilseniz SingleOrDefault() metodunu kullanmanız önerilir.

Tüm koda aşağıdan ulaşabilirsiniz..

using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplicationTest
{
    class Program {

        static void Main(string[] args) {
            Sinif sinif = new Sinif();
            var kayit = sinif.ogrenciler.SingleOrDefault(x => x.Ad == "Rihanna");
            var kayit2 = sinif.ogrenciler.Single(x => x.Ad == "Rihanna");            
        }
}

class Ogrenci 
{
        public int Id { get; set; }
        public string Ad { get; set; }
}

class Sinif 
{
        public readonly List ogrenciler;
        public Sinif() 
        {
            this.ogrenciler = OgrenciYarat().ToList();
        }

        private IEnumerable OgrenciYarat()
        {
            yield return new Ogrenci { Id = 1, Ad = "Ali" };
            yield return new Ogrenci { Id = 2, Ad = "Erdem" };
            yield return new Ogrenci { Id = 3, Ad = "Ayşe" };
            yield return new Ogrenci { Id = 4, Ad = "Lale" };
            yield return new Ogrenci { Id = 5, Ad = "Gül" };
            yield return new Ogrenci { Id = 6, Ad = "Osman" };
            yield return new Ogrenci { Id = 7, Ad = "Irmak" };
            yield return new Ogrenci { Id = 8, Ad = "Tarık" };
        }
    }
}

C#

İlginizi Çekebilir

C# Dosyaya Yazma

C#'da İşletim Sistemi Kullanıcı Adını Bulma

C# Dosya Kopyalama

C# String StartsWith Kullanımı

C# Dictionary Key Value Değerlerini Ters Çevirmek