我试图做这样的事情,但这是行不通的:

    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)
       {
           //...
       }

正如MSDN所说,索引器可能会重载,所以我决定在这里询问专家。如何重载索引器以与foreach循环配合?

最佳答案

foreach indexers无关。您需要声明一个GetEnumerator方法,该方法返回集合的枚举数。 (尽管您需要这样做,但也应该实现 IEnumerable<Car> 接口(interface),该接口(interface)提供了此方法。)在您的特定情况下,您可以像这样轻松地做到这一点:

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

实现 IEnumerable<Car> 接口(interface)的巨大好处是您可以使用所有LINQ扩展方法,例如 Where Select ,例如:
var redCars = myGarage.Where(car => car.Color == CarColor.Red);

关于c# - 重载索引器具有foreach'able类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3769159/

10-11 07:09