C# 重载索引器具有foreach';能干阶层

C# 重载索引器具有foreach';能干阶层,c#,.net,foreach,indexer,C#,.net,Foreach,Indexer,我尝试过这样做,但不起作用: class Garage { private List<Car> cars = new List<Car>(); public Car this[int i] { get { return cars[i]; } } //... } Garage g = new Garage();

我尝试过这样做,但不起作用:

    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)
       {
           //...
       }
class车库
{
私家车列表=新列表();
公共汽车本[int i]
{
获取{返回汽车[i];}
}
//...
}
车库g=新车库();
//get CS1579-无GetEnumerator定义
foreach(c车和g车)
{
//...
}
正如MSDN所说,索引器可能会过载,所以我决定在这里咨询专家。如何重载索引器以配合foreach循环?

与此无关。您需要声明一个
GetEnumerator
方法,该方法返回集合的枚举数。(当您进行此操作时,最好也实现提供此方法的接口。)在您的特定情况下,您可以像这样轻松地执行此操作:

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(); }
}
var redCars = myGarage.Cars.Where(car => car.Color == CarColor.Red);
var Employees1 = myGarage.Employees.Where(e => e.Name == 'xxx');

你也可以把你的车变成私人的,加上公共或内部的财产,因为明天你的车库里会有员工和工具等等, 所以你的列举毫无意义。 因此,对于以下内容,您没有更多的代码可供提供:

private List<Car> m_Cars=new List<Car>();
private List<Employee> m_Employees=new List<Employee>();
public  List<Car> Cars { get { return m_Cars; } }
internal List<Employee> Employees { get { return m_Employees; } }

啊,你以10秒的优势击败了我。。删除我的答案并给你+1。回答得好谢谢,我不认为这很容易。我认为非泛型的
IEnumerable
接口也必须实现。
var redCars = myGarage.Cars.Where(car => car.Color == CarColor.Red);
var Employees1 = myGarage.Employees.Where(e => e.Name == 'xxx');