c# – 重载索引器具有foreachable类

我试图做这样的事情,但这不行:
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循环配合?

解决方法

foreachindexers无关.您需要声明一个返回枚举器的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(); }
}

实现IEnumerable<Car>接口的巨大优点是您可以使用所有LINQ扩展方法,例如WhereSelect,例如:

var redCars = myGarage.Where(car => car.Color == CarColor.Red);

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...