我正在尝试使用以下示例
来理解枚举器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在没有循环的情况下在控制台第二辆车上显示?
答案 0 :(得分: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
语句的扩展有点复杂;请参阅The foreach
statement。)
答案 1 :(得分:2)
IEnumerator i = cars.GetEnumerator();
i.MoveNext();
Car firstCar = (Car)i.Current;
i.MoveNext();
Car secondCar = (Car)i.Current;
答案 2 :(得分:0)
您可以公开索引器来访问内部数组:
public class Garage : IEnumerable
{
public Car this[int i]
{
return this.cars[i];
}
}
这不是枚举器,因为C#中的枚举器完全专门用于按顺序而不是随机迭代元素。但是,如果您使用阵列存储汽车,那么公开索引器就可以了。
顺便说一下,您可能希望实现通用IEnumerable<Car>
接口,使其显式且类型安全,以便可以迭代Car
个对象。
答案 3 :(得分:0)
您可以使用:
cars.Skip(1).Take(1).Single();
拥有第二辆车(你跳过第一辆车,然后只带一辆);
答案 4 :(得分:-1)
IEnumerator类与foreach循环一起使用。 没有foreach循环就无法访问第二个项目。 (除非你深入了解C#的内部结构,否则不建议这样做。)