Ответ 1
Если вам не нужны быстрые поиски по ключу - сохранение хеш-таблицы, используемой Dictionary
, имеет определенные накладные расходы.
В чем разница между списком 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.
Итак, вы должны всегда рассматривать две по меньшей мере две вещи:
В дополнение к ответу Phillip Ngan, SOAP или иначе, вы не можете сериализовать XML объекты, реализующие IDictionary.
В: Почему я не могу сериализовать хеш-таблицы?
A: XmlSerializer не может обрабатывать классы, реализующие интерфейс IDictionary. Частично это было связано с ограничениями по расписанию и частично из-за того, что хэш-таблица не имеет аналога в системе типа XSD. Единственное решение - реализовать пользовательскую хэш-таблицу, которая не реализует интерфейс IDictionary.
В веб-службах SOAP для silverlight мы обнаружили, что Словарь не сериализуется. Это будет ситуация, когда вы будете использовать список KeyValuePair над словарем.
.
От 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
мы неожиданно изменили тип элемент, возвращаемый из счетчиков.