3

次の例を使用して列挙子を理解しようとしています

public class Garage : IEnumerable
{
    private Car[] cars = new Car[4];
    public Garage()
    {
        cars[0] = new Car() { Id = Guid.NewGuid(), Name = "Mazda 3", CurrentSpeed = 90 };
        cars[1] = new Car() { Id = Guid.NewGuid(), Name = "Mazda 6", CurrentSpeed = 80 };
    }

    public IEnumerator GetEnumerator()
    {
        // return the array object's IEnumerator
        return cars.GetEnumerator();
    }
}

static void Main(string[] args)
    {
        IEnumerator i = cars.GetEnumerator();
        i.MoveNext();
        Car myCar = (Car)i.Current;
        Console.WriteLine("{0} is going {1} km/h", myCar.Name, myCar.CurrentSpeed);
        Console.ReadLine();

    }

foreachを使用してループせずにコンソールのセカンドカーに表示するにはどうすればよいですか?

4

5 に答える 5

8
foreach (Car myCar in cars)
{
    Console.WriteLine("{0} is going {1} km/h", myCar.Name, myCar.CurrentSpeed);
}

おおよそ

IEnumerator i = cars.GetEnumerator();
while (i.MoveNext())
{
    Car myCar = (Car)i.Current;
    Console.WriteLine("{0} is going {1} km/h", myCar.Name, myCar.CurrentSpeed);
}

(実際にはforeach、C# コンパイラによって実行されるステートメントの展開はもう少し複雑です。ステートメントを参照してくださいforeach )

于 2012-11-12T08:24:00.983 に答える
2
IEnumerator i = cars.GetEnumerator();
i.MoveNext();
Car firstCar = (Car)i.Current;
i.MoveNext();
Car secondCar = (Car)i.Current;
于 2012-11-12T08:23:58.233 に答える
0

インデクサーを公開して、内部配列にアクセスできます。

public class Garage : IEnumerable
{
  public Car this[int i]
  {
    return this.cars[i];
  }
}

これは列挙子ではありません。C# の列挙子は、要素をランダムではなく順次反復処理するためにのみ使用されるためです。しかし、配列を使用して車を格納していることを考えると、インデクサーを公開しても問題ありません。

ところで、ジェネリックIEnumerable<Car>インターフェイスを実装して、オブジェクトを反復処理できるように明示的かつタイプ セーフにすることもできCarます。

于 2012-11-12T08:25:08.387 に答える
0

以下を使用できます。

cars.Skip(1).Take(1).Single();

2 台目の車を所有する (最初の車を飛ばして 1 台だけを取る)。

于 2012-11-12T08:25:35.353 に答える
-1

IEnumerator クラスは、foreach ループで使用することを目的としています。foreach ループなしで 2 番目の項目にアクセスすることはできません。(C# の内部構造を深く掘り下げない限り、お勧めしません。)

于 2012-11-12T08:24:46.730 に答える