在實現 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>
的單個迭代器方法更清晰地實現。)