Sự khác biệt giữa Danh sách KeyValuePair và Từ điển cho cùng loại là gì? Có thời điểm thích hợp để sử dụng cái này hay cái kia không?
Sự khác biệt giữa Danh sách KeyValuePair và Từ điển cho cùng loại là gì? Có thời điểm thích hợp để sử dụng cái này hay cái kia không?
Câu trả lời:
Khi bạn không cần tra cứu nhanh khóa - việc duy trì bảng băm được sử dụng Dictionary
có một chi phí nhất định.
Tóm lại, danh sách không bắt buộc tính duy nhất của khóa, vì vậy nếu bạn cần ngữ nghĩa đó thì đó là những gì bạn nên sử dụng.
Từ điển là kiểu chung chứa tập hợp các cặp khóa-giá trị. Từ điển rất nhanh cho các thao tác tra cứu, vì đang sử dụng hàm băm bên trong . Điều đó có nghĩa là, tất cả các khóa phải là duy nhất trong từ điển .
Hãy xem xét các ví dụ sau:
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
Vì vậy, bạn nên luôn cân nhắc hai ít nhất hai điều:
Danh sách cũng sẽ hữu ích khi bạn quan tâm đến thứ tự của các mặt hàng.
Ngoài câu trả lời của Phillip Ngan, SOAP hoặc cách khác, bạn không thể tuần tự hóa các đối tượng thực thi IDictionary.
H: Tại sao tôi không thể tuần tự hóa các thẻ bắt đầu bằng #?
A: XmlSerializer không thể xử lý các lớp triển khai giao diện IDictionary. Điều này một phần là do những hạn chế về lịch trình và một phần do thực tế là bảng băm không có đối tác trong hệ thống kiểu XSD. Giải pháp duy nhất là triển khai bảng băm tùy chỉnh không triển khai giao diện IDictionary.
Trong dịch vụ web SOAP dành cho silverlight, chúng tôi nhận thấy rằng Dictionary không tuần tự hóa. Đây sẽ là một tình huống mà bạn sẽ sử dụng Danh sách KeyValuePair trên Từ điển.
.
Từ http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
đấu vớiDictionaryEntry
[Krzysztof Cwalina]Chúng tôi đã thảo luận về một vấn đề với việc triển khai
IEnumerable
onDictionary<K,V>
. Loại nào nênIEnumerable.GetEnumerator().Current
trả về?KeyValuePair<K,V>
hoặcDictionaryEntry
? Tương tự choICollection.CopyTo
. Các phiên bản của kiểu nào nên được sao chép vào mảng?Chúng tôi đã quyết định như sau:
IEnumerable
và cácICollection
triển khai giao diện sẽ sử dụngKeyValuePair<K,V>
làm loại mục.IDictionary
các thành viên cụ thể (GetEnumerator
trở lạiIDictionaryEnumerator
) sẽ sử dụngDictionaryEntry
làm loại mặt hàng.Lý do là chúng tôi đang trong quá trình thực hiện một thay đổi mà
IEnumerator<T>
sẽ kéo dàiIEnumerator
. Sẽ rất lạ nếu đang đi bộ phân cấp từDictionary<K,V>
->IEnumerable<T>
->IEnumerable
chúng ta đột ngột thay đổi loại mục được trả về từ các điều tra viên.