Подтвердить что ты не робот

Когда вы использовали List <KeyValuePair <T1, T2 >> вместо словаря <T1, T2>?

В чем разница между списком KeyValuePair и Словарем для тех же типов? Есть ли подходящее время для использования одного или другого?

4b9b3361

Ответ 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 on 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мы неожиданно изменили тип элемент, возвращаемый из счетчиков.