-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から始まります。反復ごとに1ずつ減少します。条件が満たさcars.Lengthれている間、ループはこれを継続します。i!=0したがって、ループは次の値で繰り返されますi:4、3、2、1。

が配列/リストの要素インデックスとして使用されている場合i、cars [4]、cars [3]、cars [2]、cars [1]を受け取ります(逆順!)。ただし、C#の配列は(1ではなく)0から始まるため、要素にアクセスするときに1を引く必要がありますcars[i-1]

于 2012-11-12T09:57:19.443 に答える
2

最初のyieldステートメント:yieldコレクションを返す場合、コレクションを定義する代わりに、すべてのアイテムをコレクションに入れて返すと、return itが生成されます。つまり、コードは一度に1つのアイテムを返し、ランタイムは保持します。すべてのyieldリターンを追跡し、それからコレクションを作成して、メソッドにそれを返すようにします。

例えば:

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 に答える