Để trả lời câu hỏi trước tiên chúng ta cần xem xét mục đích của từ điển và công nghệ cơ bản.
Dictionary
là danh sách của KeyValuePair<Tkey, Tvalue>
mà mỗi giá trị được biểu diễn bằng khóa duy nhất của nó. Giả sử chúng tôi có một danh sách các loại thực phẩm yêu thích của bạn. Mỗi giá trị (tên món ăn) được thể hiện bằng khóa duy nhất của nó (vị trí = mức độ bạn thích món ăn này).
Mã ví dụ:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Giả sử bạn muốn giữ sức khỏe, bạn đã thay đổi quyết định và bạn muốn thay thế món "Burger" yêu thích của mình bằng món salad. Danh sách của bạn vẫn là danh sách yêu thích của bạn, bạn sẽ không thay đổi bản chất của danh sách. Yêu thích của bạn sẽ vẫn là số một trong danh sách, chỉ có điều giá trị của nó sẽ thay đổi. Đây là khi bạn gọi điều này:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Nhưng đừng quên bạn là lập trình viên, và từ bây giờ bạn hoàn thành các câu của mình với; bạn từ chối sử dụng biểu tượng cảm xúc vì chúng sẽ gây ra lỗi biên dịch và tất cả danh sách yêu thích đều dựa trên 0 chỉ mục.
Chế độ ăn uống của bạn cũng thay đổi! Vì vậy, bạn thay đổi danh sách của mình một lần nữa:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
Có hai khả năng với việc xác định, bạn muốn đưa ra một định nghĩa mới cho một thứ chưa tồn tại trước đó hoặc bạn muốn thay đổi định nghĩa đã tồn tại.
Phương thức Thêm cho phép bạn thêm bản ghi nhưng chỉ với một điều kiện: khóa cho định nghĩa này có thể không tồn tại trong từ điển của bạn.
Bây giờ chúng ta sẽ xem xét dưới mui xe. Khi bạn đang tạo từ điển, trình biên dịch của bạn đặt chỗ trước cho thùng (khoảng trống trong bộ nhớ để lưu các bản ghi của bạn). Nhóm không lưu trữ khóa theo cách bạn xác định chúng. Mỗi khóa được băm trước khi chuyển đến nhóm (do Microsoft định nghĩa), đáng nói là phần giá trị không thay đổi.
Tôi sẽ sử dụng thuật toán băm CRC32 để đơn giản hóa ví dụ của mình. Khi bạn xác định:
myDietFavorites[0] = "Pizza";
Những gì sẽ đến với thùng là db2dc565 "Pizza" (đơn giản hóa).
Khi bạn thay đổi giá trị bằng:
myDietFavorites[0] = "Spaghetti";
Bạn băm số 0 của mình lại là db2dc565 sau đó bạn tra cứu giá trị này trong nhóm của mình để tìm xem nó có ở đó không. Nếu nó ở đó, bạn chỉ cần viết lại giá trị được gán cho khóa. Nếu nó không ở đó, bạn sẽ đặt giá trị của mình vào nhóm.
Khi bạn gọi chức năng Thêm trên từ điển của mình như:
myDietFavorite.Add(0, "Chocolate");
Bạn băm số 0 của mình để so sánh giá trị của nó với giá trị trong nhóm. Bạn chỉ có thể đặt nó vào thùng nếu nó không ở đó .
Điều quan trọng là phải biết nó hoạt động như thế nào, đặc biệt nếu bạn làm việc với từ điển kiểu khóa chuỗi hoặc ký tự char. Nó phân biệt chữ hoa chữ thường vì trải qua quá trình băm. Vì vậy, ví dụ "name"! = "Name". Hãy sử dụng CRC32 của chúng tôi để mô tả điều này.
Giá trị cho "tên" là: e04112b1
Giá trị cho "Tên" là: 1107fb5b