C# và các lớp cơ sở
Nhóm các đối tượng – Phần 2
Khi được yêu cu như 1 bộ đếm, VectorEnumerator thi hành interface
IEnumerator. cũng chứa 2 trường thành viên, theVector,1 tham chiếu đến
Vector ( collection) bđếm kết hợp, location, 1 số nguyên chđịnh
nơi trong collection mà bộ đếm tham chiếu đến
Cách làm việc là xem location như là ch mục thi hành enumerator để
truy nhập Vector như mảng.khi truy nhập vector như mảng giá trị chỉ mục là
0,1,2 - tamrộng bằng cách dùng -1 như giá trị chỉ định bđếm trước khi
bắt đầu collection,và 3 để chỉ đến cuối của collection. vì vậy , việc khởi
tạo của trường nay là -1 trong hàm dng VectorEnumerator :
public VectorEnumerator(Vector theVector)
{
this.theVector = theVector;
location = -1;
}
Lưu ý rằng hàm dng cũng lấy 1 tham chiếu đến thể hiện của Vector mà
chúng ta định đếm - điu này được cung cấp trong phương thức
Vector.GetEnumerator :
public IEnumerator GetEnumerator()
{
return new VectorEnumerator(this);
}
Dictionaries
Tđiển trình y 1 cu trúc dliệu rất phức tạp mà cho phép ta truy nhập
vào các phần tử dựa trên 1 khoá nào đó, mà có thể là kiểu dliệu bất kì.ta
hay gọi là bng ánh xạ hay bảng băm.Từ điển được dùng khi ta muốn lưu trữ
dliệu như mảng nhưng muốn dùng 1 kiểu dliệu nào đó thay cho kiểu d
liu số làm chmục.nó cũng cho phép ta thêm hoặc bỏ các mục , i ging
danh sách mảng tuy nhiên nó không phải dch chuyển các mục phía sau
trong bnhớ.
Ta minh họa việc dùng t điển trong d sau
:MortimerPhonesEmployees.trong dnày ng ty điện thoại vài phn
mm xử chi tiết nhân viên .ta cn 1 cấu trúc dliệu -i giống mảng-
chứa dữ liệu của nhân viên.ta gisử rằng mỗi nhân viên trong công ty được
xác định bởi ID nhân viên,là tập kí tự như B342.. được u trữ thành đối
tượng EmployyeeID.chi tiết của nhân viên được lưu trữ thành đối tượng
EmployeeData, ví dụ chỉ chứa ID ,tên, lương của nhân viên.
giả sử ta có EmployeeID:
EmployeeID id = new EmployeeID("W435");
ta 1 biến gọi là employees, mà ta có thxem như 1 mảng đối tượng
EmployeeData.thực sự , không phải là mng - là tđiển và bi vì
là tđiển nên ta thlấy chi tiết của 1 nhân viên thông qua ID đuợc khai
báo trên:
EmployeeData theEmployee = employees[id];
// lưu ý rằng ID không phải kiu số- nó là 1 thhiện của EmployeeID
Đó sức mạnh của từ điển.Ta thể dùng kiu dữ liệu bất kì làm chmục ,
lúc y ta gọi là khoá chkhông phải là chmục nữa.khi ta cung cấp 1
khoá truy nhập vào 1 phn tử ( như ID trên ), nó sẽ xử lí trên giá trị ca khoá
trv1 số nguyên tuthuộc vào khoá, được dùng đtruy nhập vào
'mảng' để lấy dữ liệu.
Từ điển trong .NET
Trong .NET , tđiển bản được trình y qua lp Hasthable, mà cách m
việc cũng giống như tđiển thực, ngoại trừ xem khoá và mục kiểu
object.nghĩa là 1 bng m thể u tr bất kì cu trúc dữ liệu nào ta
mun.
ta thtự định nghĩa 1 lớp từ điển riêng cthể n.Microsoft cung cấp 1
lớp strừu tượng,DictionaryBase,cung cấp những chức năng cơ bản của
tđiển ,mà ta có thdẫn xuất đến lớp mà ta muốn tạo.nếu khoá là chui ta
th dùng lớp System.Collections.Specialized.StringDictionary thay cho
Hasthable.
khi tạo một Hasthable ta có thể chỉ định kích thước khởi tạo của nó:
Hasthable employees = new Hasthable(53);
đây ta chọn số 53 bởi vì thuật toán n trong được dùng cho tđiển làm
việc hiu quả hơn nếu kích thước của nó là 1 snguyên tố.
Thêm đối tượng vào tđiển ta dùng phương thức Add(), có 2 thông skiu
object : thông số đầu là khoá, thứ hai là 1 tham chiếu đến dữ liệu. ví dụ:
EmployeeID id;
EmployeeData data;
// khởi tạo id và dliu.
// giả sử employees là 1 thhin của bảng băm
//mà chứa đựng các tham chiếu EmployeeData
employees.Add(id, data);
để nhận dữ liệu ta cung cấp khoá cho nó:
EmployeeData data = employees[id];
để bỏ 1 mục ta cung cấp khoá và gọi :
employees.Remove(id);
Để đếm số mục trong từ điển ta dùng thuộc tính Count:
int nEmployees = employees.Count;
Việc u trtrong tđiển kng theo phải theo kiểu ttrên xuống, nghĩa là
ta không thtìm thấy 1 khối lớn dữ liệu phần đầu của cấu trúc và 1 khi
rỗng phần cuối. biểu đồ sau minh hoạ cho việc lưu trtrong từ điển, các
phần không đánh dấu là rỗng: