弄清楚 C# 枚举类型

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循环的情况下在控制台上显示第二辆汽车?

1
你为什么想要避免使用forach? - PVitt
仅供学习目的,我想使用MoveNext()向前移动并显示对象状态。 - user1765862
1
我会实现IEnumerable<Car> - Tim Schmelter
foreach是最好的IEnumerable伴侣。 - Felice Pollano
1
使用 while (i.MoveNext()) - StringBuilder
在集合上执行操作(即不返回值的过程,如打印)的预期方式是使用foreach - JohnB
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语句


4
错过了 using/Dispose() ... 这很重要,却常常被省略(错误地)。 - Marc Gravell

2
IEnumerator i = cars.GetEnumerator();
i.MoveNext();
Car firstCar = (Car)i.Current;
i.MoveNext();
Car secondCar = (Car)i.Current;

3
错过了使用using/Dispose()... 它非常重要,但常常被忽略(错误地)。 - Marc Gravell

0

您可以公开索引器以访问内部数组:

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

这不是一个枚举器,因为在C#中枚举器通常用于按顺序迭代元素,而不是随机访问。但是,考虑到您正在使用数组来存储您的车辆,公开索引器是可以的。
顺便提一下,您可能希望实现泛型接口>以明确和类型安全地迭代Car对象。

0

您可以使用:

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

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


-1

IEnumerator类旨在与foreach循环一起使用。如果没有foreach循环,将无法访问第二个项目。(除非您深入研究C#的内部结构,但不建议这样做。)


2
жҺўзҙўIEnumerableзҡ„еҶ…йғЁз»“жһ„жӯЈжҳҜOPиҜ•еӣҫеҒҡзҡ„дәӢжғ…пјҢжҲ‘еҸ‘зҺ°д»–зҡ„жҖҒеәҰйқһеёёеҖјеҫ—жҺЁиҚҗгҖӮдәҶи§ЈдәӢзү©зҡ„е·ҘдҪңеҺҹзҗҶ并且ж·ұе…ҘдәҶи§ЈжҖ»жҳҜеҫҲеҘҪзҡ„гҖӮ - Treb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接