在实现 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> 的单个迭代器方法更清晰地实现。)