簡體   English   中英

找出c#枚舉器

[英]figuring out c# enumerators

我正在嘗試使用以下示例來理解枚舉器

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循環的情況下在控制台第二輛車上顯示?

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語句 。)

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

您可以公開索引器來訪問內部數組:

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

這不是枚舉器,因為C#中的枚舉器完全專門用於按順序而不是隨機地迭代元素。 但是考慮到你使用數組來存儲你的汽車,暴露一個索引器是好的。

順便說一下,您可能希望實現通用的IEnumerable<Car>接口,使其顯式且類型安全,以便可以迭代Car對象。

您可以使用:

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

擁有第二輛車(你跳過第一輛然后只帶一輛);

IEnumerator類與foreach循環一起使用。 沒有foreach循環就無法訪問第二個項目。 (除非你深入了解C#的內部結構,不建議這樣做。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM