-1

我发现这个例子以相反的顺序返回自定义类型 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 {...}
}
4

2 回答 2

3

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

   for(int i=cars.Length; i!=0; i--)
   {
        yield return cars[i-1]; //this line makes me confused
   }

假设您的列表中有 4 辆车。

您的for循环从 4 的值开始。cars.Length对于每次迭代,它都会递减 1。它会在i!=0满足条件时继续执行此操作。因此,循环将使用以下值进行迭代i:4、3、2、1。

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

于 2012-11-12T09:57:19.443 回答
2

首先yield声明:使用yield时返回一个集合,但不是定义一个集合,而是将所有项目放入其中然后返回它,而是 yield return 它,这意味着您的代码一次返回 1 个项目,运行时将保持跟踪所有收益回报,从中收集并让方法返回。

例如:

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

public IEnumable GetInts
{
    get
    {
        var arr = new int[]{1,2,3,4};
        return arr;
    }
}

这些是 2 个相同的代码。但是在循环中工作时,有时使用 yield 比自己跟踪你的集合更方便。

于 2012-11-12T09:56:08.037 回答