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

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?
- Çağrı yığınından istisnayı üreten metodu bul. Hata ayrıntılarında
System.Linq.Enumerable.First,SingleveyaLastçağrısını ara. Ardından kaynak listenin ve filtrelenmiş sonucun durumunu incele. Bu örnekte kaynak listede iki öğrenci vardır; sorun,999filtresinden 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. - Filtre koşulunu kontrol et. Karşılaştırılan alanın doğru alan olduğuna bak:
s.Number == arananNumaraifadesinde 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:999için eşleşme sayısı0,101için1olur. Beklenmeyen sonuçta yalnızcaSingleyerine başka metot koyma; önce filtreyi ve karşılaştırılan değeri düzelt. - Arama anahtarını iş kuralıyla karşılaştır.
999gerç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?

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.
- Filtreye uyan ilk öğe yeterliyse
Firstveya boş sonuç bekleniyorsaFirstOrDefaultkullan. - Sonucun gerçekten benzersiz olması gerekiyorsa
Singleseç. 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. - Filtrelenmiş kaynağın son öğesine ihtiyacın varsa
Lastkullan. Ancak bu, mevcut sıralamadaki son öğedir; otomatik olarak en yeni kayıt anlamına gelmez. - Yalnızca eşleşme olup olmadığını soruyorsan
Anykullan. 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. - Kaç eşleşme olduğunu bilmek istiyorsan
Countkullan.
Ö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.