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