在實現 IEnumerableT 時使用 yield 來建立 IEnumeratorT

IEnumerable<T> 介面有一個方法 GetEnumerator(),它返回 IEnumerator<T>

雖然 yield 關鍵字可用於直接建立 IEnumerable<T>,但它可以以完全相同的方式用於建立 IEnumerator<T>。唯一改變的是方法的返回型別。

如果我們想建立自己的實現 IEnumerable<T> 的類,這可能很有用:

public class PrintingEnumerable<T> : IEnumerable<T>
{
    private IEnumerable<T> _wrapped;

    public PrintingEnumerable(IEnumerable<T> wrapped)
    {
        _wrapped = wrapped;
    }

    // This method returns an IEnumerator<T>, rather than an IEnumerable<T>
    // But the yield syntax and usage is identical.
    public IEnumerator<T> GetEnumerator()
    {
        foreach(var item in _wrapped)
        {
            Console.WriteLine("Yielding: " + item);
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

(請注意,此特定示例僅是說明性的,並且可以使用返回 IEnumerable<T> 的單個迭代器方法更清晰地實現。)