0Pricing
C# Academy · Pelajaran

yield break dan Penghentian Dini

Hentikan iterasi berdasarkan kondisi tertentu.

yield break dan Penghentian Dini adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Menghentikan Iterator Lebih Awal

Terkadang Anda ingin iterator berhenti menghasilkan nilai sebelum mencapai akhir alaminya. Pernyataan yield break segera mengakhiri urutan, seperti return untuk iterator.

yield break Dasar

yield break mengakhiri iterator. Tidak ada nilai berikutnya yang dihasilkan dan perulangan foreach yang menggunakannya berakhir.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> UpToFive()
    {
        for (int i = 1; i <= 100; i++)
        {
            if (i > 5) yield break;
            yield return i;
        }
    }

    public static void Main()
    {
        foreach (var n in UpToFive())
            Console.WriteLine(n);
    }
}

Ambil Selama Kondisi Terpenuhi

Pola yang umum adalah menghasilkan elemen hanya selama suatu kondisi benar, lalu berhenti. yield break membuatnya menjadi sederhana.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> WhileSmall(IEnumerable<int> nums)
    {
        foreach (var n in nums)
        {
            if (n >= 10) yield break;
            yield return n;
        }
    }

    public static void Main()
    {
        foreach (var n in WhileSmall(new[] { 2, 4, 8, 12, 3 }))
            Console.WriteLine(n);
    }
}

Klausa Penjaga dengan yield break

Anda dapat menggunakan yield break di awal iterator sebagai penjaga. Jika masukan kosong atau tidak valid, iterator tidak mengembalikan elemen apa pun.

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

public class Program
{
    static IEnumerable<string> Lines(string text)
    {
        if (string.IsNullOrEmpty(text)) yield break;
        foreach (var line in text.Split('\n'))
            yield return line;
    }

    public static void Main()
    {
        foreach (var l in Lines("a\nb\nc"))
            Console.WriteLine(l);
        Console.WriteLine("empty count: " + Lines("").Count());
    }
}

Membatasi Jumlah Keluaran

Gunakan pencacah bersama yield break untuk membatasi jumlah elemen yang dihasilkan iterator, bahkan dari sumber yang panjang.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Take(IEnumerable<int> source, int max)
    {
        int count = 0;
        foreach (var item in source)
        {
            if (count++ >= max) yield break;
            yield return item;
        }
    }

    public static void Main()
    {
        foreach (var n in Take(new[] { 1, 2, 3, 4, 5 }, 3))
            Console.WriteLine(n);
    }
}

break oleh Pemanggil dibandingkan dengan yield break

Ada dua cara urutan dapat berakhir. Pemanggil dapat berhenti mengambil nilai dengan break, atau iterator dapat berhenti menghasilkan nilai dengan yield break. Keduanya mengakhiri perulangan, tetapi karena alasan yang berbeda.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Counting()
    {
        int i = 1;
        while (true) yield return i++;
    }

    public static void Main()
    {
        // Caller decides to stop with break
        foreach (var n in Counting())
        {
            if (n > 3) break;
            Console.WriteLine(n);
        }
    }
}

yield break Hanya Mengakhiri Iterator Saat Ini

yield break keluar dari metode iterator tempatnya berada, bukan dari perulangan luar pada pemanggil. Alur kendali kembali kepada pihak yang sedang melakukan enumerasi.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Bounded(IEnumerable<int> nums, int limit)
    {
        foreach (var n in nums)
        {
            if (n > limit) yield break; // ends Bounded only
            yield return n;
        }
    }

    public static void Main()
    {
        var result = Bounded(new[] { 1, 2, 9, 3 }, 5);
        Console.WriteLine("iterator created, still running");
        foreach (var n in result) Console.WriteLine(n);
    }
}

Tidak Ada yield return Setelah yield break

Setelah yield break dijalankan, iterator selesai. Kode apa pun yang secara fisik berada setelahnya dalam jalur yang sama tidak dapat menghasilkan nilai.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Demo(bool stopEarly)
    {
        yield return 1;
        if (stopEarly) yield break;
        yield return 2;
        yield return 3;
    }

    public static void Main()
    {
        Console.WriteLine("stopEarly = true:");
        foreach (var n in Demo(true)) Console.WriteLine(n);
        Console.WriteLine("stopEarly = false:");
        foreach (var n in Demo(false)) Console.WriteLine(n);
    }
}

Menggabungkan Filter dan Penghentian Dini

Anda dapat memfilter dan mengakhiri proses dalam iterator yang sama: lewati beberapa nilai, hasilkan nilai lainnya, lalu berhenti sepenuhnya saat menemukan nilai penanda.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> UntilZero(IEnumerable<int> nums)
    {
        foreach (var n in nums)
        {
            if (n == 0) yield break;     // stop at sentinel
            if (n < 0) continue;         // skip negatives
            yield return n;
        }
    }

    public static void Main()
    {
        foreach (var n in UntilZero(new[] { 3, -1, 5, 0, 9 }))
            Console.WriteLine(n);
    }
}

Blok yield break dan finally

Jika iterator Anda memiliki try/finally, finally tetap dijalankan saat yield break mengakhiri urutan. Ini menjamin pembersihan, seperti menutup sumber daya.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> WithCleanup()
    {
        try
        {
            yield return 1;
            yield break;
        }
        finally
        {
            Console.WriteLine("cleanup ran");
        }
    }

    public static void Main()
    {
        foreach (var n in WithCleanup())
            Console.WriteLine(n);
    }
}

Coba Sendiri

Gabungkan penyaringan dan penghentian dini: hasilkan angka positif, tetapi hentikan seluruh proses begitu sum berjalan melampaui anggaran.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> WithinBudget(IEnumerable<int> nums, int budget)
    {
        int spent = 0;
        foreach (var n in nums)
        {
            if (n <= 0) continue;
            if (spent + n > budget) yield break;
            spent += n;
            yield return n;
        }
    }

    public static void Main()
    {
        foreach (var n in WithinBudget(new[] { 3, -2, 4, 5, 1 }, 10))
            Console.WriteLine(n);
    }
}

Pemeriksaan Singkat

Ingat kembali peran yield break.

Ringkasan

yield break mengakhiri iterator lebih awal.

  • Fungsinya seperti return tanpa nilai untuk iterator.
  • Gunakan untuk logika ambil-selama, penjagaan, dan batas jumlah.
  • Ini hanya mengakhiri iterator, bukan perulangan pemanggil.
  • Blok finally tetap dijalankan untuk memastikan pembersihan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “yield break dan Penghentian Dini” gratis?

Ya — teks lengkap “yield break dan Penghentian Dini” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “yield break dan Penghentian Dini”?

Hentikan iterasi berdasarkan kondisi tertentu. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “yield break dan Penghentian Dini” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Metode Iterator dengan yield return
  2. yield break dan Penghentian Dini
  3. Semantik Evaluasi Malas
  4. Enumerable Kustom
← Kembali ke C# Academy