我尝试过这样的事情,但这不起作用:
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
循环?
答案 0 :(得分:36)
foreach
与indexers无关。您需要声明一个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扩展方法,例如: Where
和Select
,例如:
var redCars = myGarage.Where(car => car.Color == CarColor.Red);
答案 1 :(得分:0)
您还可以将您的汽车设为私人,并添加公共或内部财产,因为明天您的车库中将有员工和工具等, 所以你的枚举将毫无意义。 因此,通过以下内容,您无需提供更多代码:
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');