产量如何在ForEach块内工作?

如何在下面显示的foreach循环中使用Yield? 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
}

这是处理长数据流的一种非常常见的方式,您可以在其中按顺序选择一部分流程,并在请求另一部分流程之后,依此类推。

而在第二种情况下,您将只是返回列表中的第一个元素,而不会跳转到其他元素。

链接地址: http://www.djcxy.com/p/54315.html

上一篇: How Yield works within a ForEach block?

下一篇: Yield statement's effect on program flow