Trước khi chúng ta đi vào sự khác biệt giữa IEnumerable và IEnumerator, trước tiên chúng ta hãy hiểu các thuật ngữ Enumerator và Enumerable và khi nào và tại sao nên sử dụng chúng.
Enumerable là một mô-đun được sử dụng trong lớp Array cung cấp cho bạn Enumerator. Lớp học không có mỗi phương thức. Trên thực tế, nó sử dụng một phương thức gọi là 'GetEnumerator' cung cấp cho bạn một Enumerator để lấy vật phẩm của nó.
Trình liệt kê là một đối tượng trả về từng mục trong một bộ sưu tập theo một thứ tự cụ thể, chính xác như chúng được yêu cầu. Trình biên dịch tạo mã sử dụng Trình liệt kê, khi bạn viết một vòng lặp foreach trong C #.
IEnumerator là một giao diện được thực hiện bởi một điều tra viên và lớp vô số thực hiện giao diện IEnumerable.
IEnumerable là một giao diện cơ bản được sử dụng để có được một đối tượng biết cách liệt kê (hoặc lặp) qua các phần tử trong bộ sưu tập.
Đó là một triển khai của mẫu lặp cung cấp một cơ chế để duyệt qua một đối tượng trong bộ sưu tập bất kể cấu trúc bên trong của nó. Giao diện IEnumerable đại diện cho một đối tượng có thể được lặp đi lặp lại trong một bộ sưu tập.
Nó chỉ sử dụng một phương thức, GetEnumerator, đó là trả về một thể hiện của lớp liệt kê thực hiện giao diện IEnumerator.
Giao diện IEnumerator, mặt khác, khai báo hai phương thức - Reset () và MoveNext () - và một thuộc tính, Hiện tại. MoveNext () trả về một vale Boolean chỉ ra phần cuối của danh sách và giúp định vị phần tử đầu tiên trong danh sách sau khi gọi phương thức Reset () - nó đặt trình liệt kê về vị trí mặc định của nó để lặp lại danh sách từ bắt đầu.
Thuộc tính Hiện tại chỉ có thể được gọi thông qua một phiên bản của giao diện IEnumerator và nó trả về phần tử hiện tại trong danh sách.
Cả IEnumerable và IEnumerator đều là các giao diện triển khai mẫu thiết kế phần mềm iterator trong .Net Framework cùng nhau. .Net Framework giúp truy cập các phần tử riêng lẻ trong bộ sưu tập tùy chỉnh trong khi triển khai các giao diện IEnumerable và IEnumerator. Giao diện IEnumerable chỉ khai báo một phương thức gọi là GetEnumerator trả về một loại giao diện khác gọi là giao diện IEnumerator cho bộ sưu tập cụ thể đó. Mặt khác, IEnumerator là giao diện cơ sở cho tất cả các điều tra viên không chung chung được sử dụng để đọc dữ liệu trong bộ sưu tập. Tuy nhiên, liệt kê không thể được sử dụng để sửa đổi bộ sưu tập cơ bản.
Giao diện IEnumerable chỉ định nghĩa một phương thức GetEnumerator () là một phương thức thể hiện được sử dụng trên một số loại bộ sưu tập khác nhau. Nó nhận được một trình lặp IEnumerator có thể được sử dụng để lặp lại tất cả các giá trị từ bộ sưu tập. Khi bạn viết một vòng lặp foreach trong C #, mã nó sẽ tạo ra các phương thức GetEnumerator để tạo ra Enumerator được sử dụng bởi vòng lặp.
Mặt khác, IEnumerator sử dụng hai phương thức MoveNext () và Reset () và thuộc tính Hiện tại. Phương thức MoveNext () đưa bộ liệt kê đến phần tử tiếp theo của bộ sưu tập, trong khi phương thức Reset () đặt bộ liệt kê về vị trí mặc định của nó trước phần tử đầu tiên trong bộ sưu tập.
IEnumerable là một giao diện chung cung cấp một sự trừu tượng để lặp qua các phần tử và bằng cách thực hiện giao diện IEnumerable, một lớp chung về cơ bản cho phép lặp qua giao diện IEnumerator. Khi làm như vậy, các lớp này cuối cùng cung cấp một giao diện chung để lấy một thể hiện của một đối tượng IEnumerator hỗ trợ tất cả các phương thức điều hướng cơ bản.
IEnumerator là giao diện cơ sở cho các điều tra viên và việc sử dụng giao diện IEnumerable yêu cầu lớp phải thực hiện IEnumerator. Cả hai giao diện cần phải được thực hiện, nếu bạn muốn cung cấp hỗ trợ cho foreach. Lớp trừu tượng 'AbstractEnumerator' thực hiện giao diện IEnumerator.
Giao diện IEnumerable, cùng với giao diện IEnumerator hỗ trợ, cho phép bạn lặp lại các phần tử trong ngăn xếp bằng cách sử dụng câu lệnh 'foreach'. Nó là giao diện cơ bản được sử dụng cho các đối tượng kiểu bộ sưu tập. Lặp lại bắt đầu với phần tử trên cùng trong ngăn xếp và kết thúc bằng phần tử cũ nhất trong ngăn xếp. Nói một cách đơn giản, nó đại diện cho một đối tượng có thể được liệt kê.
Cùng với giao diện IEnumerator, họ cho phép các phần tử ArrayList được lặp lại theo kiểu tuần tự được chuẩn hóa, bắt đầu với phần tử đầu tiên và tiếp tục. Câu lệnh foreach sử dụng các phương thức và thuộc tính của giao diện IEnumerator để lặp lại tất cả các phần tử trong một bộ sưu tập.
Tóm lại, cả IEnumerable và IEnumerator đều là các giao diện được sử dụng để liệt kê hoặc lặp lại một lớp có tính chất bộ sưu tập có nghĩa là chúng tạo điều kiện truy cập lặp trong bộ sưu tập tùy chỉnh. IEnumerable là giao diện chung có sẵn cho các đối tượng loại bộ sưu tập và bằng cách triển khai giao diện IEnumerable, một lớp chung về cơ bản cho phép lặp qua giao diện IEnumerator. Nó chỉ sử dụng một phương thức GetEnumerator trả về một thể hiện của lớp liệt kê thực hiện giao diện IEnumerator. Giao diện IEnumerator có nghĩa là được sử dụng như các bộ truy cập và nó không thể được sử dụng để sửa đổi bộ sưu tập cơ bản. Nó cung cấp hai phương thức trừu tượng Reset () và MoveNext () và một thuộc tính Hiện tại để gọi một phần tử cụ thể trong bộ sưu tập.