В чем разница между списком KeyValuePair и Словарем для тех же типов? Есть ли подходящее время для использования одного или другого?
Когда вы использовали List <KeyValuePair <T1, T2 >> вместо словаря <T1, T2>?
Ответ 1
Если вам не нужны быстрые поиски по ключу - сохранение хеш-таблицы, используемой Dictionary
, имеет определенные накладные расходы.
Ответ 2
Короче говоря, список не обеспечивает уникальность ключа, поэтому, если вам нужна эта семантика, то то, что вы должны использовать.
Ответ 3
Список также будет полезен, когда вы будете заботиться о порядке элементов.
Ответ 4
Словарь общий тип, содержащий набор пар ключ-значение. Словарь быстрый для операций поиска, потому что использует хэш-функцию внутри. Это означает, что все ключи должны быть уникальными в словаре.
Рассмотрим следующие примеры:
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.
Итак, вы должны всегда рассматривать две по меньшей мере две вещи:
- Вы хотите найти конкретные предметы в словаре?
- Вы хотите иметь некоторые поля не уникальные (например, пары: имя/фамилия).
Ответ 5
В дополнение к ответу Phillip Ngan, SOAP или иначе, вы не можете сериализовать XML объекты, реализующие IDictionary.
В: Почему я не могу сериализовать хеш-таблицы?
A: XmlSerializer не может обрабатывать классы, реализующие интерфейс IDictionary. Частично это было связано с ограничениями по расписанию и частично из-за того, что хэш-таблица не имеет аналога в системе типа XSD. Единственное решение - реализовать пользовательскую хэш-таблицу, которая не реализует интерфейс IDictionary.
Ответ 6
В веб-службах SOAP для silverlight мы обнаружили, что Словарь не сериализуется. Это будет ситуация, когда вы будете использовать список KeyValuePair над словарем.
.
Ответ 7
От http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx:
KeyValuePair
противDictionaryEntry
[Krzysztof Cwalina]Мы обсудили проблему с реализация
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
мы неожиданно изменили тип элемент, возвращаемый из счетчиков.