У чому різниця між списком KeyValuePair та словником для тих самих типів? Чи є підходящий час для використання того чи іншого?
У чому різниця між списком KeyValuePair та словником для тих самих типів? Чи є підходящий час для використання того чи іншого?
Відповіді:
Коли вам не потрібні швидкі пошуки за ключем - підтримка хеш-таблиці, що використовується, Dictionary
має певні накладні витрати.
Коротше кажучи, список не забезпечує унікальності ключа, тож якщо вам потрібна ця семантика, то саме це вам слід використовувати.
Словник - це загальний тип, який містить набір пар ключ-значення. Словник швидко виконує операції пошуку, оскільки внутрішньо використовує хеш-функцію . Це означає, що всі ключі повинні бути унікальними у словнику .
Розглянемо ці приклади:
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.
Тому завжди слід враховувати принаймні дві речі:
Список також буде корисний, коли ви дбаєте про порядок предметів.
Крім відповіді Філіпа Нгана, SOAP чи іншим способом, ви не можете XML серіалізувати об'єкти, що реалізують IDictionary.
З: Чому я не можу серіалізувати хештеги?
В: XmlSerializer не може обробляти класи, що реалізують інтерфейс IDictionary. Частково це було пов'язано з обмеженнями розкладу, а частково через те, що хеш-таблиця не має аналога в системі типу XSD. Єдиним рішенням є реалізація власної хеш-таблиці, яка не реалізує інтерфейс IDictionary.
У веб-сервісах SOAP для silverlight ми виявили, що словники не серіалізуються. У такій ситуації ви б використовували список KeyValuePair над словником.
.
З http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePair
протиDictionaryEntry
[Кшиштофа Кваліни]Ми обговорили проблему з реалізацією
IEnumerable
onDictionary<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
ми раптово змінили тип елемента, що повертається з перечислювачів.