0Pricing
C# Academy · บทเรียน

yield break และการสิ้นสุดก่อนกำหนด

หยุดการวนซ้ำตามเงื่อนไข

yield break และการสิ้นสุดก่อนกำหนด เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

การหยุดตัววนซ้ำก่อนกำหนด

บางครั้งคุณต้องการให้ตัววนซ้ำหยุดสร้างค่าก่อนถึงจุดสิ้นสุดตามปกติ คำสั่ง yield break จะจบลำดับทันที คล้ายกับ return สำหรับตัววนซ้ำ

คำสั่งยุติตัววนซ้ำพื้นฐาน

yield break จะยุติตัววนซ้ำ จะไม่มีการสร้างค่าเพิ่มเติม และลูป foreach ที่ใช้ตัววนซ้ำนั้นจะจบลง

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);
    }
}

รับค่าต่อไปขณะที่เงื่อนไขเป็นจริง

รูปแบบที่ใช้บ่อยคือส่งคืนรายการเฉพาะขณะที่เงื่อนไขเป็นจริง แล้วจึงหยุด yield break ทำให้รูปแบบนี้เขียนได้อย่างกระชับ

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);
    }
}

ใช้เงื่อนไขป้องกันด้วยคำสั่งยุติตัววนซ้ำ

คุณสามารถใช้ yield break ที่ด้านบนของตัววนซ้ำเป็นเงื่อนไขป้องกันได้ หากอินพุตว่างเปล่าหรือไม่ถูกต้อง ก็ให้ส่งคืนรายการเป็นศูนย์

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());
    }
}

จำกัดจำนวนเอาต์พุต

ใช้ตัวนับร่วมกับ yield break เพื่อจำกัดจำนวนรายการที่ตัววนซ้ำจะสร้าง แม้จะมาจากแหล่งข้อมูลขนาดยาวก็ตาม

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 หรือตัววนซ้ำอาจหยุดสร้างค่าด้วย yield break ทั้งสองวิธีทำให้ลูปจบลงเหมือนกัน แต่ด้วยเหตุผลที่ต่างกัน

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 จะออกจากเมธอดตัววนซ้ำที่มีคำสั่งนี้อยู่ ไม่ได้ออกจากลูปภายนอกของผู้เรียก การควบคุมจะย้อนกลับไปยังส่วนที่กำลังแจกแจงลำดับ

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);
    }
}

ไม่มีการส่งคืนค่าแบบทยอยสร้างหลังจากยุติตัววนซ้ำ

เมื่อ yield break ทำงาน ตัววนซ้ำจะเสร็จสิ้นทันที โค้ดใด ๆ ที่อยู่หลังคำสั่งนี้ในเส้นทางเดียวกันจะไม่สามารถสร้างค่าได้

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);
    }
}

การรวมการกรองกับการหยุดก่อนกำหนด

คุณสามารถกรองและยุติการทำงานในตัววนซ้ำเดียวกันได้ โดยข้ามค่าบางส่วน ส่งคืนค่าอื่น ๆ และยุติทั้งหมดทันทีเมื่อพบค่าพิเศษที่บอกจุดสิ้นสุด

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);
    }
}

การยุติตัววนซ้ำและบล็อกการทำงานท้ายสุด

หากตัววนซ้ำของคุณมี try/finally บล็อก finally จะยังคงทำงานเมื่อ yield break ยุติลำดับข้อมูล การทำเช่นนี้ช่วยรับประกันการเก็บกวาดทรัพยากร เช่น การปิดทรัพยากรต่าง ๆ

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);
    }
}

ลองทำด้วยตนเอง

ผสานการกรองเข้ากับการยุติก่อนกำหนด โดยส่งคืนตัวเลขบวก แต่หยุดทั้งหมดทันทีเมื่อผลรวมสะสมเกินงบประมาณ

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);
    }
}

ตรวจสอบอย่างรวดเร็ว

ทบทวนบทบาทของ yield break

สรุปทบทวน

yield break ยุติตัววนซ้ำก่อนกำหนด

  • ทำงานคล้ายกับ return ที่ไม่ส่งคืนค่า สำหรับตัววนซ้ำ
  • ใช้กับตรรกะการวนต่อขณะเงื่อนไขเป็นจริง ตัวป้องกัน และขีดจำกัดจำนวน
  • ยุติเฉพาะตัววนซ้ำ ไม่ได้ยุติลูปของผู้เรียก
  • บล็อก finally ยังคงทำงาน เพื่อให้แน่ใจว่ามีการเก็บกวาดทรัพยากร

คำถามที่พบบ่อย

บทเรียน “yield break และการสิ้นสุดก่อนกำหนด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “yield break และการสิ้นสุดก่อนกำหนด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “yield break และการสิ้นสุดก่อนกำหนด”

หยุดการวนซ้ำตามเงื่อนไข คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “yield break และการสิ้นสุดก่อนกำหนด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เมธอดตัววนซ้ำด้วย yield return
  2. yield break และการสิ้นสุดก่อนกำหนด
  3. ความหมายของการประเมินค่าแบบขี้เกียจ
  4. ชนิด Enumerable แบบกำหนดเอง
← กลับไปที่ C# Academy