Yield 如何在foreach
如下所示的循环中工作?lstNumbers 是类型List<int>
。
foreach (int i in lstNumbers)
{
yield return i;
}
它会在收到值时开始返回,还是在最后返回最终列表?
它与以下有何不同:
foreach (int i in lstNumbers)
{
return i;
}
Yield 如何在foreach
如下所示的循环中工作?lstNumbers 是类型List<int>
。
foreach (int i in lstNumbers)
{
yield return i;
}
它会在收到值时开始返回,还是在最后返回最终列表?
它与以下有何不同:
foreach (int i in lstNumbers)
{
return i;
}
在此示例中,它将一一返回所有值,但使用代码需要开始迭代结果集:
foreach (int i in lstNumbers)
{
yield return i;
}
看看下面的例子,它会1, 2
在控制台上打印,for
如果消费代码没有遍历可枚举,方法内的循环将永远不会结束:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
foreach (var item in Get().Take(2))
{
Console.WriteLine(item);
}
}
static IEnumerable<int> Get()
{
foreach (var item in new[] { 1, 2, 3 })
{
yield return item;
}
}
}
在这种情况下,您可能不需要产生任何东西,只需返回结果,因为您已经拥有它:
return lstNumbers;
而在第二种情况下:
foreach (int i in lstNumbers)
{
return i;
}
您只是返回列表的第一个值,迭代立即中断。
在第一种情况下,它只是i
在调用时返回return i
。
在调用者再次对函数调用迭代器后,它将跳转到下一次迭代。
举例说明:
int GetNextNumber() {
foreach (int in in lstNumbers)
{
yield return in; //returns on first hit
}
}
之后
foreach(var i in GetNextNumber()) {
//process number got from the GetNextNumber()
//on next iteration GetNextNumber() will be called again
// so the next number from lstNumbers will be returned
}
这是处理长数据流的一种非常常见的方法,您可以按顺序选择其中的一部分,然后再请求另一个,依此类推。
相反,在第二种情况下,您将始终返回列表中的第一个元素,而永远不会跳转到其他元素。