需要帮助理解IEnumerable中的C#yield

Jie*_*eng 4 c#

我正在阅读C#2010 Accelerated.我不知道是什么yield

调用GetEnumerator时,包含yield语句的方法中的代码实际上并未在该时间点执行.相反,编译器生成枚举器类,该类包含yield块代码

public IEnumerator<T> GetEnumerator() { 
    foreach( T item in items ) { 
        yield return item; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

我也读了一些帮助理解"产量"

yield是一个懒惰的数据生成器,只在检索到第一个后生成另一个项目,而返回一个列表将一次性返回所有内容.

这是否意味着每次调用GetEnumerator都会从集合中获得1个项目?所以第一个电话我得到第一个项目,第二个,我得到第二个,依此类推......?

man*_*ock 7

想到它的最佳方式是当你第一次请求某个项目时IEnumerator(例如在a中foreach),它开始通过该方法运行,当它点击yield return它时暂停执行并返回该项目供你在你的项目中使用foreach.然后你请求下一个项目,它恢复它离开的代码并重复循环,直到它遇到方法的任何一个yield break或结束.

public IEnumerator<string> enumerateSomeStrings()
{
    yield return "one";
    yield return "two";
    var array = new[] { "three", "four" }
    foreach (var item in array)
        yield return item;
    yield return "five";
}
Run Code Online (Sandbox Code Playgroud)