Kadang kita hanya butuh satu elemen: nilai pertama, nilai terakhir, atau satu-satunya yang cocok. Operator element mengambil elemen tersebut secara langsung, dan keluarga *OrDefault menentukan apa yang terjadi bila tidak ada elemen yang memenuhi.

Mengambil Elemen Tunggal #

Contoh berikut memakai beberapa operator sekaligus, lalu menangkap dua exception yang muncul bila syarat tidak terpenuhi:

csharp
int[] nilai = { 85, 60, 90, 45, 75 };

Console.WriteLine($"First: {nilai.First()}");
Console.WriteLine($"Pertama >= 75: {nilai.First(n => n >= 75)}");
Console.WriteLine($"Last < 70: {nilai.Last(n => n < 70)}");
Console.WriteLine($"ElementAt 2: {nilai.ElementAt(2)}");
Console.WriteLine($"FirstOrDefault > 100: {nilai.FirstOrDefault(n => n > 100)}");
Console.WriteLine($"Single == 60: {nilai.Single(n => n == 60)}");

try
{
    Console.WriteLine(nilai.First(n => n > 100));
}
catch (InvalidOperationException e)
{
    Console.WriteLine($"Galat: {e.Message}");
}

try
{
    Console.WriteLine(nilai.Single(n => n >= 70));
}
catch (InvalidOperationException e)
{
    Console.WriteLine($"Galat: {e.Message}");
}

Output yang Dihasilkan:

text
First: 85
Pertama >= 75: 85
Last < 70: 45
ElementAt 2: 90
FirstOrDefault > 100: 0
Single == 60: 60
Galat: Sequence contains no matching element
Galat: Sequence contains more than one matching element

Mari kita bedah baris demi baris:

  1. nilai.First(): elemen pertama; melempar exception bila urutan kosong.
  2. nilai.First(n => n >= 75): elemen pertama yang memenuhi predikat.
  3. nilai.Last(n => n < 70): elemen terakhir yang memenuhi predikat.
  4. nilai.ElementAt(2): elemen pada indeks ke-2, dihitung dari nol.
  5. nilai.FirstOrDefault(n => n > 100): tidak ada yang memenuhi, sehingga dikembalikan nilai default int yaitu 0, tanpa exception.
  6. dua pesan galat: kedua baris Galat: adalah pesan asli .NET 9 saat syarat tidak terpenuhi dan saat memenuhi lebih dari satu elemen.

Versi *OrDefault mengembalikan null untuk tipe referensi dan nilai default untuk tipe nilai. LastOrDefault dan ElementAtOrDefault berperilaku sama, sehingga kueri lebih tahan terhadap data kosong tanpa blok try-catch. Dengan pilihan ini, baca kode menjadi lebih mudah: operator tanpa akhiran OrDefault menyatakan ekspektasi bahwa data seharusnya ada, sedangkan operator dengan akhiran itu menyatakan bahwa hasil kosong adalah kondisi normal.

Untuk List<T>, ElementAt(i) setara dengan indeks nilai[i], tetapi operator ini bekerja pada IEnumerable<T> apa pun yang tidak menawarkan pengakses indeks. Pada sumber besar, perhatikan juga bahwa Last harus menelusuri seluruh sumber sampai selesai karena operator tidak dapat menghentikan iterasi lebih awal.