623
Chương 16: Các giao diện và mẫu thông dụng
tượng có hiện thực giao diện
System.IEnumerator
. Giao diện
IEnumerator
định
nghĩa các phương thức sẽ được lệnh
foreach
sử dụng để kiệt kê tập hợp.
Một bộ chỉ mục bằng số (numerical indexer) cho phép bạn duyệt qua các phần tử của một tập
hợp bằng vòng lặp
for
. Tuy nhiên, kỹ thuật này không cung cấp mức trừu tượng phù hợp với
các cấu trúc dữ liệu phi tuyến, như cây và tập hợp đa chiều. Lệnh
foreach
cung cấp một cơ
chế duyệt qua các đối tượng của một tập hợp mà không quan tâm cấu trúc bên trong của
chúng là gì.
Để hỗ trợ ngữ nghĩa
foreach
, đối tượng chứa tập hợp phải hiện thực giao diện
System.IEnumerable
. Giao diện
này khai báo một phương thức có tên là
GetEnumerator
,
phương thức này không nhận đối số và trả về một đối tượng
System.IEnumerator
:
IEnumerator GetEnumerator();
Đối tượng
IEnumerator
là đối tượng hỗ trợ việc liệt kê các phần tử của tập hợp. Giao diện
IEnumerator
cung cấp một con chạy chỉ-đọc, chỉ-tiến (read-only, forward-only cursor) dùng
để truy xuất các thành viên của tập hợp nằm dưới. Bảng 16.1 mô tả các thành viên của giao
diện
IEnumerator
.
Bảng 16.1 Các thành viên của giao diện IEnumerator
Thành viên
Mô tả
Current
Thuộc tính này trả về phần tử dữ liệu hiện tại. Khi enumerator được tạo
ra,
Current
chỉ đến vị trí đứng trước phần tử dữ liệu đầu tiên, nghĩa là bạn
phải gọi
MoveNext
trước khi sử dụng
Current
. Nếu
Current
được gọi và
enumerator đang đứng trước phần tử đầu tiên hoặc sau phần tử cuối cùng
trong tập hợp dữ liệu,
Current
sẽ ném ngoại lệ
System.InvalidOperationException
.
MoveNext
Phương thức này dịch chuyển enumerator sang phần tử dữ liệu kế tiếp
trong tập hợp; trả về
true
nếu còn phần tử, trả về
false
nếu không còn
phần tử. Nếu nguồn dữ liệu nằm dưới thay đổi trong thời gian sống của
enumerator,
MoveNext
sẽ ném ngoại lệ
InvalidOperationException
.
Reset
Phương thức này dịch chuyển enumerator về vị trí đứng trước phần tử đầu
tiên trong tập hợp dữ liệu. Nếu nguồn dữ liệu nằm dưới thay đổi trong thời
gian sống của enumerator,
Reset
sẽ ném ngoại lệ
InvalidOperationException
.
[
Các lớp
TeamMember
,
Team
, và
TeamMemberEnumerator
minh họa việc hiện thực giao diện
IEnumerable
và
IEnumerator
. Lớp
TeamMember
mô tả một thành viên của một đội:
// Lớp TeamMember mô tả một thành viên trong đội.
public class TeamMember {
public string Name;
public string Title;
// Phương thức khởi dựng đơn giản.