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);
}

(实际上,由 C# 编译器执行的语句扩展有点foreach复杂;请参阅语句。)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();

拥有第二辆车(你跳过第一辆车,然后只拿一辆);

于 2012-11-12T08:25:35.353 回答
-1

IEnumerator 类与 foreach 循环一起使用。如果没有 foreach 循环,就无法访​​问第二个项目。(除非您深入了解 C# 的内部结构,否则不建议这样做。)

于 2012-11-12T08:24:46.730 回答