c#命名迭代器和yield
我发现了这个例子,它以相反的顺序返回自定义类型的Car对象。 有人能给我解释一下这个密码吗。谢谢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 } }
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
}