Khi nào bạn sử dụng Danh sách <KeyValuePair <T1, T2 >> thay vì Từ điển <T1, T2>?


95

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:


80

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 Dictionarycó một chi phí nhất định.


9
Ngoài ra danh sách chèn hoạt động nhanh hơn mà một trong từ điển
Vadym Stetsiak

2
Các trường của nó là chỉ đọc, nhưng bạn luôn có thể thay thế toàn bộ phần tử trong danh sách.
Pavel Minaev

Thêm sự khác biệt ở đây
Vinni

62

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.


7
+1 Lưu ý rằng từ điển cũng không thực thi tính duy nhất của giá trị!
gdoron đang hỗ trợ Monica

25

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:

  1. Bạn có muốn tìm kiếm các mục cụ thể trong từ điển?
  2. Bạn có muốn có một số trường không phải là duy nhất (ví dụ các cặp: tên / họ).

1
Tôi nghĩ vấn đề ở đây là các khóa từ điển phải là duy nhất trong đó các khóa List <KeyValuePair> không được là duy nhất.
Bruno Bieri

5
Danh sách @BrunoBieri <KeyValuePair> phím có thể không phải là duy nhất
Nikhil Vartak

2
Tôi đã sửa lại nhận xét cũ 2 năm của bạn, và bạn nhận thấy điều đó. Không có gì ngạc nhiên khi SO là nền tảng Hỏi & Đáp duy nhất đáng tin cậy và phổ biến nhất.
Nikhil Vartak

14

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.


2
SortedDictionary sẽ không bao gồm điều này?
Alex Angas

2
Có, nhưng SortedDictionary không thể bao gồm thứ tự của các giá trị, chỉ có các khóa.
Nhầm

7

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.

từ đây


5

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.

.


3

Từ http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :

KeyValuePairđấu với DictionaryEntry
[Krzysztof Cwalina]

Chúng tôi đã thảo luận về một vấn đề với việc triển khai IEnumerableon Dictionary<K,V>. Loại nào nên IEnumerable.GetEnumerator().Current trả về? KeyValuePair<K,V>hoặc DictionaryEntry? Tương tự cho ICollection.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ác ICollectiontriển khai giao diện sẽ sử dụng KeyValuePair<K,V>làm loại mục. IDictionarycác thành viên cụ thể ( GetEnumeratortrở lại IDictionaryEnumerator) sẽ sử dụng DictionaryEntrylà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ài IEnumerator. 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.