c#命名迭代器和yield

时间:2012-11-12 09:45:17

标签: 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
     }
   }
   else {...}
}

2 个答案:

答案 0 :(得分:3)

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

   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用作阵列/列表的元素索引,那么您将收到汽车[4],汽车[3],汽车[2],汽车[1](逆序!)。但是因为C#中的数组从0(而不是1)开始,所以在访问元素时需要减去1:cars[i-1]

答案 1 :(得分:2)

首先使用yield语句:当使用yield时,您将返回一个集合,但不是定义集合,而是将所有项放入其中然后返回它,您将返回它,这意味着你的代码当时返回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;
    }
}

这两个代码也是如此。但是当在循环中工作时,有时候使用yield比使用自己跟踪你的收藏更方便。