重载索引器具有foreach'able类

nan*_*nan 10 .net c# foreach indexer

我试图做这样的事情,但这不起作用:

    class Garage
    {
        private List<Car> cars = new List<Car>();

        public Car this[int i]
        {
            get { return cars[i]; }
        }
         //...
    }

       Garage g =  new Garage();
       //get CS1579 - no GetEnumerator definition
       foreach (Car c in g)
       {
           //...
       }
Run Code Online (Sandbox Code Playgroud)

由于MSDN说索引器可能超载,所以我决定在这里问专家.如何重载索引器与foreach循环合作?

Tim*_*mwi 37

foreach索引器无关.您需要声明一个GetEnumerator返回集合枚举器的方法.(当你在它的时候,实现IEnumerable<Car>接口也是明智的,它提供了这种方法.)在你的特定情况下,你可以像这样轻松地做到:

class Garage : IEnumerable<Car>
{
    private List<Car> cars = new List<Car>();

    public Car this[int i]
    {
        get { return cars[i]; }
    }

    // For IEnumerable<Car>
    public IEnumerator<Car> GetEnumerator() { return cars.GetEnumerator(); }

    // For IEnumerable
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
Run Code Online (Sandbox Code Playgroud)

实施的一个巨大的好处IEnumerable<Car>界面,你可以使用所有的LINQ扩展方法,如WhereSelect,例如:

var redCars = myGarage.Where(car => car.Color == CarColor.Red);
Run Code Online (Sandbox Code Playgroud)

  • 我认为,非通用的"IEnumerable"接口也必须实现. (3认同)