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

96

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

Труп
источник

Ответы:

81

Когда вам не нужен быстрый поиск по ключу - поддержание хэш-таблицы, используемой, Dictionaryимеет определенные накладные расходы.

Павел Минаев
источник
9
Кроме того, операция вставки списка выполняется быстрее, чем в словаре,
Вадим Стецяк
2
Его поля доступны только для чтения, но вы всегда можете заменить весь элемент в списке.
Павел Минаев
Больше различий здесь
Винни
63

Короче говоря, список не обеспечивает уникальность ключа, поэтому, если вам нужна эта семантика, вы должны использовать ее.

RCIX
источник
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> не должны быть уникальными.
Бруно Бьери
6
@BrunoBieri List <KeyValuePair> ключи не могут быть уникальными
Нихил Вартак
2
Я исправил ваш 2-летний комментарий, и вы это заметили. Неудивительно, почему SO является единственной надежной и самой популярной платформой вопросов и ответов.
Nikhil Vartak 06
14

Список также будет полезен, когда вы заботитесь о порядке элементов.

никто
источник
2
Разве SortedDictionary не охватит это?
Alex Angas
2
Да, но SortedDictionary не может охватывать порядок значений, только ключи.
ConfusedMan
7

В дополнение к ответу Филиппа Нгана, SOAP или иначе, вы не можете сериализовать XML-объекты, реализующие IDictionary.

В: Почему я не могу сериализовать хэш-таблицы?

О: XmlSerializer не может обрабатывать классы, реализующие интерфейс IDictionary. Частично это произошло из-за ограничений расписания, а частично из-за того, что хеш-таблица не имеет аналога в системе типов XSD. Единственное решение - реализовать настраиваемую хеш-таблицу, которая не реализует интерфейс IDictionary.

отсюда

Tjmoore
источник
5

В веб-сервисах SOAP для silverlight мы обнаружили, что словарь Dictionary не сериализуется. Это может быть ситуация, когда вы использовали бы список KeyValuePair вместо словаря.

.

Филип Нган
источник
3

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

KeyValuePairvs. 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 мы внезапно изменили тип элемента, возвращаемого перечислителями.

Анакс
источник