thể trùng lặp:
Can anyone explain IEnumerable and IEnumerator to me?Sự khác nhau giữa IEnumerator và IEnumerable là gì?
sự khác biệt giữa IEnumerator và IEnumerable là gì?
thể trùng lặp:
Can anyone explain IEnumerable and IEnumerator to me?Sự khác nhau giữa IEnumerator và IEnumerable là gì?
sự khác biệt giữa IEnumerator và IEnumerable là gì?
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();
@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
@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. –
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();
}
}
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 MoveNext
và Reset
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.
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.
Bài đăng trên blog đó không chính xác. – SLaks
Nhân bản: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me –