Tidak semua urutan perlu dihabiskan sampai akhir. Petugas bioskop yang memindai kursi berhenti begitu menemukan kursi kosong pertama, karena kursi setelahnya pasti kosong juga. Iterator method memiliki pernyataan khusus untuk situasi ini: yield break mengakhiri urutan seketika, dan MoveNext() berikutnya mengembalikan false tanpa mengirim item lagi.
Posisi yield break di Antara Pernyataan Lain #
Tiga pernyataan sering tertukar ketika menulis iterator:
| Pernyataan | Akibat pada iterator |
|---|---|
break | Menghentikan loop di dalam badan method; iterator masih bisa melanjutkan baris setelah loop |
yield break | Menghentikan seluruh urutan; konsumen melihat iterasi selesai |
return | Tidak boleh dikombinasikan dengan yield return; method iterator hanya mengirim item lewat yield |
Aturan tambahan yang perlu diingat: yield break boleh berada di dalam blok try yang memiliki klausa catch, sedangkan yield return tidak boleh (galat CS1626 yang dibahas bab sebelumnya).
Contoh: Memindai Kursi Terisi #
Method berikut mengirim nomor kursi yang terisi dan berhenti di kursi kosong pertama:
public static IEnumerable<int> NomorKursiTerisi(bool[] kursi)
{
for (int i = 0; i < kursi.Length; i++)
{
if (!kursi[i])
{
yield break;
}
yield return i + 1;
}
}
bool[] kursiBioskop = { true, true, true, false, false };
foreach (int nomor in NomorKursiTerisi(kursiBioskop))
{
Console.WriteLine($"Kursi terisi: nomor {nomor}");
}Output yang Dihasilkan:
Kursi terisi: nomor 1
Kursi terisi: nomor 2
Kursi terisi: nomor 3Mari kita bedah baris demi baris:
for (int i = 0; i < kursi.Length; i++): iterator memindai array kursi dari depan;kursiBioskopberisi lima nilai dengan dua kursi terakhir kosong.if (!kursi[i]): kondisi memeriksa kursi kosong; pada indeks keempat (nomor 4), nilaifalsemembuat kondisi terpenuhi.yield break;: urutan diakhiri di titik ini. Item nomor 4 dan 5 tidak pernah dikirim, meskipun loop secara teknis masih bisa berlanjut.yield return i + 1;: sebelum kondisi terpenuhi, setiap kursi terisi dikirim sebagai nomor satu-berbasis: indeks 0 menjadi nomor 1, dan seterusnya.foreachpada konsumen: loop konsumen berakhir dengan normal setelah tiga item; konsumen tidak menerima sinyal kesalahan, hanya urutan yang berhenti lebih awal.
yield break menuntaskan urutan secara permanen. Bab berikutnya mengupas karakter penting iterator method yang muncul di kedua contoh sejauh ini: eksekusi badan yang ditunda sampai enumerasi dimulai.