yield return ใช้สร้าง Iterator แบบ Lazy Evaluation (Deferred Execution) ควบคุม State ระหว่าง Caller และ Iterator
ตัวอย่าง: Running Total
using System;
using System.Collections.Generic;
namespace DemoApplication
{
class Program
{
static List numbers = new List { 1, 2, 3, 4, 5 };
static void Main()
{
foreach (int total in RunningTotal())
{
Console.WriteLine(total);
}
Console.ReadLine();
}
static IEnumerable RunningTotal()
{
int sum = 0;
foreach (int n in numbers)
{
sum += n;
yield return sum; // ส่งค่ากลับ แล้วหยุดรอ Next()
}
}
}
}
Output
1 3 6 10 15
ทำงานอย่างไร?
- Caller เรียก
foreach→ เรียกRunningTotal()ได้ Enumerator - Enumerator รันจนเจอ
yield return→ ส่งค่าให้ Caller → หยุด (Suspend) - Caller ทำงานต่อ (Print) → เรียก
MoveNext()→ Enumerator ทำงานต่อจากจุดหยุด - State (ตัวแปร
sum) ถูกเก็บไว้ → ไม่ต้องคำนวณใหม่
ประโยชน์
- Memory Efficient: ไม่ต้องสร้าง List ทั้งหมดใน Memory
- Lazy: คำนวณต่อเมื่อถูกขอ (On-demand)
- Infinite Sequence ได้:
yield returnใน While True