2010-09-22 19 views
9

tôi đã cố gắng để làm một cái gì đó như thế này nhưng điều này không làm việc:quá tải indexer có lớp foreach'able

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

Như MSDN nói indexers có thể bị quá tải, vì vậy tôi quyết định hỏi các chuyên gia ở đây. Làm thế nào để quá tải chỉ mục để hợp tác với vòng lặp foreach?

Trả lời

34

foreach không liên quan gì với indexers. Bạn cần khai báo phương thức GetEnumerator trả về một điều tra viên cho bộ sưu tập. (. Trong khi bạn đang ở đó, nó có thể là khôn ngoan để thực hiện các giao diện IEnumerable<Car> là tốt, trong đó cung cấp phương pháp này) Trong trường hợp cụ thể của bạn, bạn có thể làm điều đó một cách dễ dàng như thế này:

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

Một lợi ích lớn của thực hiện giao diện IEnumerable<Car> là bạn có thể sử dụng tất cả các phương thức mở rộng LINQ, ví dụ WhereSelect, ví dụ:

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

ah, bạn đánh tôi vào punch 10 giây .. đã xóa câu trả lời của tôi và cho bạn +1. Câu trả lời tốt –

+0

Cảm ơn, không cho rằng nó dễ dàng như vậy – nan

+3

Giao diện 'IEnumerable' không chung chung cũng phải được triển khai, tôi nghĩ vậy. –

0

Bạn cũng có thể làm cho chiếc xe của bạn riêng tư, và thêm một tài sản công cộng hoặc nội bộ, bởi vì ngày mai trong nhà để xe của bạn, bạn sẽ phải lao động và công cụ và như vậy, để enumerate của bạn sẽ không có cảm giác. Vì vậy, với các nội dung sau bạn không có nhiều mã để cung cấp:

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

Vì vậy, bạn có thể sử dụng foreach, trên xe ô tô, nhân viên như thế này:

var redCars = myGarage.Cars.Where(car => car.Color == CarColor.Red); 
var Employees1 = myGarage.Employees.Where(e => e.Name == 'xxx'); 
Các vấn đề liên quan