在 C# 中有 foreach
語法,可以快速的列舉集合 (ex. List) 中的所有元素。
而 foreach
的背後,其實就是集合的類別實做了 IEnumerable 介面,即 Iterator 設計模式。讓其他人操作此類別的集合時,不必知道集合列舉的邏輯,就能一一的列舉元素。
如果要自己實作 IEnumerable 介面,就要實作 Current 屬性, Dispose()、MoveNext()、Reset() 等方法,因此可以透過 yield
精簡程式碼,寫出更直覺的語法。(仔細體會yield的甜美: yield介紹 - iT 邦幫忙)
使用 yield
的話,只需要在 IEnumerable 介面內撰寫列舉的邏輯,並加入 yield
關鍵字即可。
using System;
using System.Collections;
using System.Collections.Generic;
// 自訂一個集合類別,實作 IEnumerable 介面
public class NumberCollection : IEnumerable<int>
{
private int[] numbers = { 1, 2, 3, 4, 5 };
// 實作 GetEnumerator 方法,使用 yield return 來簡化列舉邏輯
public IEnumerator<int> GetEnumerator()
{
foreach (var number in numbers)
{
yield return number; // 列舉 numbers 的所有元素
}
}
// 明確的 IEnumerable 方法實作
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class Program
{
public static void Main()
{
// 使用自訂的 NumberCollection 類別
var collection = new NumberCollection();
// 使用 foreach 列舉 NumberCollection 中的所有元素
foreach (var num in collection)
{
Console.WriteLine(num);
}
}
}