2009-03-06 70 views

Trả lời

90

IEnumerable là một giao diện định nghĩa một phương pháp GetEnumerator mà trả về một giao diện IEnumerator, điều này lần lượt cho phép truy cập chỉ đọc một bộ sưu tập. Một bộ sưu tập thực hiện IEnumerable có thể được sử dụng với một tuyên bố foreach.

Definition

IEnumerable 

public IEnumerator GetEnumerator(); 

IEnumerator 

public object Current; 
public void Reset(); 
public bool MoveNext(); 

example code from codebetter.com

+3

@Rex M: Tôi nghĩ rằng mã này có ý nghĩa. IEnumerable có phương thức GetEnumerator trả về một IE * * ator *, không phải IEnumer * có thể *. – Lernkurve

+5

@Lernkurve câu trả lời đã được sửa đổi để chính xác sau khi tôi đăng bình luận của mình. –

6

IEnumerable và IEnumerator là cả hai giao diện. IEnumerable chỉ có một phương thức gọi là GetEnumerator. Phương thức này retuns (như tất cả các phương thức trả về một cái gì đó bao gồm void) một loại khác là một giao diện và giao diện đó là IEnumerator. Khi bạn thực hiện logic liệt kê trong bất kỳ lớp bộ sưu tập nào của bạn, bạn thực hiện IEnumerable (hoặc là chung chung hoặc không chung chung). IEnumerable chỉ có một phương thức trong khi IEnumerator có 2 phương thức (MoveNext và Reset) và một thuộc tính Current. Để dễ hiểu, hãy xem xét IEnumebale một hộp có chứa IEnumerator bên trong nó (mặc dù không thông qua kế thừa hoặc ngăn chặn). Xem mã để hiểu rõ hơn:

class Test : IEnumerable, IEnumerator 
    { 
     IEnumerator IEnumerable.GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     public object Current 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool MoveNext() 
     { 
      throw new NotImplementedException(); 
     } 
     public void Reset() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
58

Một IEnumerator là một điều mà có thể liệt kê: nó có Current bất động sản và các MoveNextReset phương pháp (mà trong mã NET có thể bạn sẽ không gọi một cách rõ ràng , mặc dù bạn có thể).

An IEnumerable là một thứ có thể liệt kê ... điều này đơn giản có nghĩa là nó có phương thức GetEnumerator trả về IEnumerator.

Bạn sử dụng công cụ nào? Lý do duy nhất để sử dụng IEnumerator là nếu bạn có thứ gì đó có cách đếm không chuẩn (nghĩa là trả về các phần tử khác nhau của nó), và bạn cần xác định cách thức hoạt động. Bạn sẽ tạo một lớp mới thực hiện IEnumerator. Nhưng bạn vẫn cần phải trả lại số IEnumerator trong lớp học IEnumerable.

Đối với một cái nhìn vào những gì một Enumerator (thực hiện IEnumerator<T>) trông như thế nào, thấy bất kỳ lớp Enumerator<T>, chẳng hạn như những người chứa trong List<T>, Queue<T>, hoặc Stack<T>. Để xem một lớp thực hiện IEnumerable, hãy xem bất kỳ lớp thu thập tiêu chuẩn nào.

13

An Enumerator hiển thị cho bạn các mục trong danh sách hoặc bộ sưu tập. Mỗi trường hợp của một ĐTV tại một vị trí nhất định (phần tử thứ nhất, phần tử thứ 7, v.v.) và có thể cung cấp cho bạn phần tử đó (IEnumerator.Current) hoặc chuyển sang phần tiếp theo (IEnumerator.MoveNext). Khi bạn viết một vòng lặp foreach trong C#, trình biên dịch tạo mã có sử dụng Bộ đếm.

An Enumerable là lớp học có thể cung cấp cho bạn Enumerator s.Nó có một phương pháp gọi là GetEnumerator, cung cấp cho bạn một số Enumerator xem các mục của nó. Khi bạn viết một vòng lặp foreach trong C#, mã mà nó tạo ra các cuộc gọi GetEnumerator để tạo ra các Enumerator được sử dụng bởi vòng lặp.

+1

Bài đăng trên blog đó không chính xác. – SLaks

Các vấn đề liên quan