Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

C# Sequence Contains No Elements Hatası Nasıl Çözülür?

csharp-sequence-contains-no-elements-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Boş sonuç neden hata verir? Hatalı ve güvenli sorgu
  2. Sorunlu satırı üç adımda nasıl teşhis edersin?
  3. First, Single ve Last arasından nasıl seçim yaparsın?
  4. Null koleksiyon ile boş koleksiyonu nasıl ayırt edersin?

C# Sequence contains no elements hatası, First(), Last() veya Single() çağrısının işlemeye çalıştığı sonuç kümesi boş kaldığında oluşur. First ve Last en az bir kayıt bekler; Single ise tam olarak bir eşleşme bekler. Bu nedenle çözüm, metodu otomatik olarak OrDefault ile değiştirmekten önce kaydın bulunamamasının iş kuralında normal kabul edilip edilmediğini belirlemektir.

Aşağıdaki küçük List<Student> örneğinde önce hatanın nedenini, ardından boş sonucun açıkça nasıl yönetileceğini görebilirsin.

Boş sonuç neden hata verir? Hatalı ve güvenli sorgu

Boş sonuç neden hata verir? Hatalı ve güvenli sorgu

Where filtresi, Number değeri 999 olan bir öğrenci bulamaz ve geriye boş bir sonuç bırakır. Bu boş sonucu Single() ile tek bir nesneye çevirmeye çalıştığında.NET, beklenen tek kaydı bulamadığı için System.InvalidOperationException üretir. Where(...).Single() ve Where(...).First() gibi parametresiz sonlandırıcı çağrılarda görülen temel İngilizce mesaj Sequence contains no elements olur. Koşulu doğrudan alan Single(predicate) ve First(predicate) aşırı yüklerinde ise boş eşleşme mesajı Sequence contains no matching element şeklinde farklılaşabilir. Bu nedenle aynı istisna türünü kullanan tüm çağrı biçimlerine aynı hata metnini atfetmemelisin.

Önce ortak kurulumu hazırla. Yorum satırının yerine aşağıdaki iki alternatif sorgudan yalnızca birini ekleyerek örneği çalıştırabilirsin:

using System;
using System.Collections.Generic;
using System.Linq;

public class Student
{
    public int Number { get; set; }
    public string Name { get; set; }
}

public class Program
{
    public static void Main()
    {
        var students = new List<Student>
        {
            new Student { Number = 101, Name = "Deniz" },
            new Student { Number = 102, Name = "Ece" }
        };

        int arananNumara = 999;

        // Aşağıdaki alternatiflerden yalnızca birini buraya ekle.
    }
}

Hatalı sorgu: Sonuç kesinmiş gibi Single kullanmak

var student = students
    .Where(s => s.Number == arananNumara)
    .Single();

Console.WriteLine(student.Name);

Bu sorguda filtrelenmiş sonuç kümesinde hiç kayıt olmadığı için Console.WriteLine satırına gelinmeden istisna oluşur.

System.InvalidOperationException:
Sequence contains no elements

Güvenli sorgu: Boş sonuç normal kabul ediliyorsa

var student = students
    .Where(s => s.Number == arananNumara)
    .SingleOrDefault();

if (student is null)
{
    Console.WriteLine("Öğrenci bulunamadı.");
}
else
{
    Console.WriteLine(student.Name);
}

arananNumara değeri 999 olduğunda beklenen çıktı şöyledir:

Öğrenci bulunamadı.

arananNumara değerini 101 yaparsan tek eşleşme bulunur ve çıktı şu olur:

Deniz

Burada SingleOrDefault seçilmesinin nedeni, öğrenci numarasının benzersiz olması gerektiği varsayımıdır. Yani beklenen durum sıfır veya bir eşleşmedir. Ancak aynı numaraya sahip iki öğrenci kaydı varsa SingleOrDefault bunu sessizce seçip gizlemez; birden fazla eşleşmede yine InvalidOperationException üretir. Böylece eksik kayıt ile veri bütünlüğü sorununu birbirinden ayırabilirsin.

Sorunlu satırı üç adımda nasıl teşhis edersin?

  1. Çağrı yığınından istisnayı üreten metodu bul. Hata ayrıntılarında System.Linq.Enumerable.First, Single veya Last çağrısını ara. Ardından kaynak listenin ve filtrelenmiş sonucun durumunu incele. Bu örnekte kaynak listede iki öğrenci vardır; sorun, 999 filtresinden sonra hiçbir öğrencinin kalmamasıdır. Sonraki adım olarak sorguyu geçici biçimde ayrı bir değişkene alıp gerçekten boş olup olmadığını kontrol et.
  2. Filtre koşulunu kontrol et. Karşılaştırılan alanın doğru alan olduğuna bak: s.Number == arananNumara ifadesinde numara ile numara karşılaştırılıyor mu? Büyük-küçük harf, ek koşullar veya yanlış değişken kullanımı eşleşmeyi engelliyor mu? Sabit listedeki teşhis gözlemi nettir: 999 için eşleşme sayısı 0, 101 için 1 olur. Beklenmeyen sonuçta yalnızca Single yerine başka metot koyma; önce filtreyi ve karşılaştırılan değeri düzelt.
  3. Arama anahtarını iş kuralıyla karşılaştır. 999 gerçekten istenen öğrenci numarası mı? Bu numaranın listede bulunması zorunlu mu, yoksa kullanıcı aramasında bulunamaması normal mi? Sonucu üç sınıftan birine ayır: beklenen yokluk, yanlış anahtar veya filtre, eksik zorunlu veri. İlk durumda “Öğrenci bulunamadı.” gibi kontrollü bir akış tasarla. Diğer iki durumda ise metodu değiştirmek yerine kaynak veriyi, anahtarı veya veri yükleme sürecini düzelt.

Bu üç adım, LINQ'in tüm kapsamını ölçen bir değerlendirme değildir; yalnızca temel C# ve koleksiyon davranışını hızlıca görmek istersen C# seviye testi ile başlangıç noktanı ve eksiklerini daha net fark edebilirsin.

First, Single ve Last arasından nasıl seçim yaparsın?

First, Single ve Last arasından nasıl seçim yaparsın?

C# Sequence contains no elements hatası alıyorsan sorun her zaman yalnızca sonucun boş olması değildir; seçtiğin metodun kaç eşleşme beklediğini de kontrol etmelisin. First ve Last bir öğe bekler, Single ise tam olarak bir eşleşme bekler. Aşağıdaki küçük örnekte filtrelenmiş kaynak iki öğrenci içerir:

var filtered = students
    .Where(s => s.Score >= 90)
    .ToList();

// filtered: Can, Ece
var first = filtered.First();   // Can
var last = filtered.Last();     // Ece
var only = filtered.Single();   // InvalidOperationException

Tablo, null olmayan ve önceden filtrelenmiş bir kaynakta, ek varsayılan değer argümanı içermeyen Enumerable çağrılarının davranışını gösterir. Karşılaştırma sağlayıcı tabanlı sorgulara değil, LINQ-to-Objects kullanımına yöneliktir.

Metot 0 eşleşme 1 eşleşme Birden fazla eşleşme
First InvalidOperationException Tek öğe İlk öğe
FirstOrDefault default(T) Tek öğe İlk öğe
Single InvalidOperationException Tek öğe InvalidOperationException
SingleOrDefault default(T) Tek öğe InvalidOperationException
Last InvalidOperationException Tek öğe Son öğe
Any false true true
Count 0 1 Eşleşme sayısı

Student bir sınıf, yani referans türü olduğu için default(T) değeri null olur. int gibi sayısal bir türde ise varsayılan değer 0’dır.

  1. Filtreye uyan ilk öğe yeterliyse First veya boş sonuç bekleniyorsa FirstOrDefault kullan.
  2. Sonucun gerçekten benzersiz olması gerekiyorsa Single seç. Sıfır eşleşme ya da birden fazla eşleşme veri kuralına aykırıysa istisna görünür bir uyarı olur.
  3. Filtrelenmiş kaynağın son öğesine ihtiyacın varsa Last kullan. Ancak bu, mevcut sıralamadaki son öğedir; otomatik olarak en yeni kayıt anlamına gelmez.
  4. Yalnızca eşleşme olup olmadığını soruyorsan Any kullan. Ardından aynı sorguyu tekrar çalıştırmayı her durumda geçerli bir çözüm sayma; ihtiyacın nesne mi, varlık bilgisi mi, yoksa adet mi olduğunu baştan belirle.
  5. Kaç eşleşme olduğunu bilmek istiyorsan Count kullan.

Özellikle SingleOrDefault, çoklu eşleşmeyi çözmez. Yalnızca sıfır eşleşmede varsayılan değer döndürür; iki veya daha fazla eşleşmede yine InvalidOperationException üretir. C# ve yazılım konularında farklı teknik okumalar için Berk Akademi blogu içindeki içeriklere göz atabilirsin.

Null koleksiyon ile boş koleksiyonu nasıl ayırt edersin?

Boş koleksiyon, nesnenin mevcut olduğu fakat içinde hiç öğe bulunmadığı durumdur: new List<Student>(). null koleksiyon ise değişkenin herhangi bir koleksiyon nesnesine referans vermediğini gösterir. Bu iki durumun hata türleri birbirinden farklıdır:

var emptyStudents = new List<Student>();

emptyStudents.First();                  // InvalidOperationException

List<Student>? source = null;

source.Count();                         // ArgumentNullException
source.Count;                           // NullReferenceException

var result = emptyStudents.FirstOrDefault();
Console.WriteLine(result.Name);         // NullReferenceException

Burada Count() LINQ uzantı metodudur ve null kaynak kendisine gönderildiğinde ArgumentNullException üretir. List.Count ise listenin örnek özelliğidir; null bir nesnenin örnek üyesine erişmeye çalışmak NullReferenceException ile sonuçlanır. Benzer şekilde FirstOrDefault, null kaynak sorununu ortadan kaldırmaz; source.FirstOrDefault() çağrısında kaynak null ise yine ArgumentNullException alırsın. Boş bir listede ise sonuç Student için null olur ve bu sonucu kontrol etmeden Name alanına erişmek ayrı bir NullReferenceException oluşturur.

Şu dönüşüm yalnızca iş kuralında null değer gerçekten “öğrenci yok” anlamına geliyorsa uygundur:

var normalized = source ?? new List<Student>();

Kaynağın null olması verinin henüz yüklenmediğini, yanlış aktarıldığını veya başka bir akış hatasını gösteriyorsa bu dönüşüm sorunu gizleyebilir. Bu nedenle önce null değerinin anlamını belirle, sonra boş listeye dönüştürme kararı ver.

Çalışma notu: Hata ayıklarken kaynak değişkenini, filtre koşulunu, sonucun null mı yoksa boş mu olduğunu ve seçtiğin metodun beklentisini kısa notlarla kaydet. Berk Akademi’deki kişiye özel ödev ve ilerleme istatistikleri yaklaşımı da hangi adımda zorlanıldığını görünür kılmaya dayanır. Birebir program seçenekleri Python Özel Ders, Java Özel Ders ve AP Computer Science Principles sınav hazırlığı seçeneklerine yöneliktir; bu içerik C# programı önermez.

Önce koleksiyonun boş mu yoksa null mı olduğunu, ardından kaç eşleşme beklediğini belirlediğinde doğru LINQ metodunu seçebilir ve hatayı rastgele OrDefault ekleyerek değil, anlamını koruyarak çözebilirsin.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara