Коли б ви використовували List <KeyValuePair <T1, T2 >> замість словника <T1, T2>?


95

У чому різниця між списком KeyValuePair та словником для тих самих типів? Чи є підходящий час для використання того чи іншого?

Відповіді:


80

Коли вам не потрібні швидкі пошуки за ключем - підтримка хеш-таблиці, що використовується, Dictionaryмає певні накладні витрати.


9
Також операція вставки списку швидша, ніж операція зі словника
Вадим Стецяк

2
Його поля доступні лише для читання, але ви завжди можете замінити весь елемент у списку.
Павло Мінаєв

Більше відмінностей тут
Вінні

62

Коротше кажучи, список не забезпечує унікальності ключа, тож якщо вам потрібна ця семантика, то саме це вам слід використовувати.


7
+1 Зверніть увагу, що словник також не застосовує унікальність значення!
gdoron підтримує Моніку

25

Словник - це загальний тип, який містить набір пар ключ-значення. Словник швидко виконує операції пошуку, оскільки внутрішньо використовує хеш-функцію . Це означає, що всі ключі повинні бути унікальними у словнику .

Розглянемо ці приклади:

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.

Тому завжди слід враховувати принаймні дві речі:

  1. Ви хочете шукати конкретні предмети у словнику?
  2. Ви хочете, щоб деякі поля були не унікальними (наприклад, пари: ім'я / прізвище).

1
Я думаю, справа тут у тому, що ключі словника повинні бути унікальними, де ключі List <KeyValuePair> не повинні бути унікальними.
Bruno Bieri

5
Клавіші списку @BrunoBieri <KeyValuePair> можуть бути не унікальними
Nikhil Vartak

2
Я виправив ваш 2-річний коментар, і ви це помітили. Не дивно, чому SO - це єдина і найпопулярніша платформа запитань та відповідей.
Nikhil Vartak

14

Список також буде корисний, коли ви дбаєте про порядок предметів.


2
Чи не SortedDictionary це охоплює?
Alex Angas

2
Так, але SortedDictionary не може охоплювати порядок значень, лише ключі.
Confused,

7

Крім відповіді Філіпа Нгана, SOAP чи іншим способом, ви не можете XML серіалізувати об'єкти, що реалізують IDictionary.

З: Чому я не можу серіалізувати хештеги?

В: XmlSerializer не може обробляти класи, що реалізують інтерфейс IDictionary. Частково це було пов'язано з обмеженнями розкладу, а частково через те, що хеш-таблиця не має аналога в системі типу XSD. Єдиним рішенням є реалізація власної хеш-таблиці, яка не реалізує інтерфейс IDictionary.

звідси


5

У веб-сервісах SOAP для silverlight ми виявили, що словники не серіалізуються. У такій ситуації ви б використовували список KeyValuePair над словником.

.


3

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

KeyValuePairпроти DictionaryEntry
[Кшиштофа Кваліни]

Ми обговорили проблему з реалізацією IEnumerableon Dictionary<K,V>. Який тип слід IEnumerable.GetEnumerator().Current повернути? KeyValuePair<K,V>чи DictionaryEntry? Те саме для ICollection.CopyTo. Екземпляри якого типу слід скопіювати в масив?

Ми вирішили наступне: IEnumerable і ICollectionреалізації інтерфейсу використовуватимуть KeyValuePair<K,V>як тип елемента. IDictionaryконкретні члени (що GetEnumeratorповертаються IDictionaryEnumerator) використовуватимуть DictionaryEntryяк тип товару.

Причина в тому, що ми перебуваємо в процесі внесення змін, куди IEnumerator<T>би поширились IEnumerator. Було б дуже дивно, якби ми, проходячи ієрархію з Dictionary<K,V>-> IEnumerable<T>-> IEnumerable ми раптово змінили тип елемента, що повертається з перечислювачів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.