11

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

    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循环?

4

2 回答 2

40

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

实现该IEnumerable<Car>接口的一个巨大好处是您可以使用所有 LINQ 扩展方法,例如Whereand Select,例如:

var redCars = myGarage.Where(car => car.Color == CarColor.Red);
于 2010-09-22T12:26:27.790 回答
1

您还可以将您的汽车私有化,并添加公共或内部财产,因为明天在您的车库中您将拥有员工和工具等,因此您的枚举将毫无意义。因此,对于以下内容,您无需提供更多代码:

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

所以你可以像这样在汽车、员工上使用 foreach:

var redCars = myGarage.Cars.Where(car => car.Color == CarColor.Red);
var Employees1 = myGarage.Employees.Where(e => e.Name == 'xxx');
于 2016-11-21T08:21:47.230 回答