c#命名迭代器和yield

c#命名迭代器和yield,c#,yield,C#,Yield,我发现了这个例子,它以相反的顺序返回自定义类型的Car对象。 有人能给我解释一下这个密码吗。谢谢 public IEnumerable GetTheCars(bool returnReversed) { if(returnReversed) { for(int i=cars.Length; i!=0; i--) { yield return cars[i-1]; //this line makes me confused } }

我发现了这个例子,它以相反的顺序返回自定义类型的Car对象。 有人能给我解释一下这个密码吗。谢谢

public IEnumerable GetTheCars(bool returnReversed)
{
   if(returnReversed)
   {
     for(int i=cars.Length; i!=0; i--)
     {
        yield return cars[i-1]; //this line makes me confused
     }
   }
   else {...}
}

首先是
yield
语句:当使用
yield
时,您返回的是一个集合,而不是定义一个集合,将所有项目放入其中,然后返回,您返回它,这意味着您的代码每次返回1个项目,运行时将跟踪所有yield返回,从中创建一个集合,并让方法返回该集合

例如:

public IEnumable GetInts
{
    get
    {
        yield return 1;
        yield return 2;
        yield return 3;
        yield return 4;
    }
}


这两个代码的作用相同。但在循环中工作时,有时使用收益率比自己跟踪收藏更方便。

您在评论中指出,您需要解释反向排序的工作原理

   for(int i=cars.Length; i!=0; i--)
   {
        yield return cars[i-1]; //this line makes me confused
   }
假设您的列表中有4辆车

您的
for
循环从值
cars.Length
开始,该值将为4。对于每一次迭代,它递减1。当
i=满足0
条件。因此,循环将使用以下
i
值进行迭代:4、3、2、1


如果
i
用作数组/列表的元素索引,则您将收到cars[4]、cars[3]、cars[2]、cars[1](顺序相反!)。但是因为C#中的数组从0开始(而不是1),所以在访问元素时需要减去1:
cars[i-1]

到底是什么让你感到困惑?你需要解释一下
产量
或者汽车是如何按相反的顺序归还的吗?@davenewza汽车是如何按相反的顺序归还的。对此你有什么不明白的?你了解循环的
吗?你可以查看,并了解更多关于这一点的信息。虽然我的问题有点困惑,但这正是我需要的。只是澄清一下。这两个代码示例的作用不同。您的第一段解释了这些差异,代码的实际工作方式有很大的不同。它们都返回具有相同内容的集合。确实存在差异,但对于手边不重要的一点(我认为),主要的区别在于,对于收益率,执行是懒惰的,因为在返回的IEnumerable上调用MoveNext之前,代码不会执行。返回数组时不是这种情况,在数组中,集合在那里创建,然后返回整个数组。因此,“他们也这样做”的说法是不正确的。但我相信你知道这一点,我只是向那些可能还不了解区别的读者指出。
   for(int i=cars.Length; i!=0; i--)
   {
        yield return cars[i-1]; //this line makes me confused
   }