В чем разница между списком 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 мы обнаружили, что словарь Dictionary не сериализуется. Это может быть ситуация, когда вы использовали бы список KeyValuePair вместо словаря.
.
С http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspx :
KeyValuePairvs.DictionaryEntry
[Кшиштоф Квалина]Мы обсуждали проблему с реализацией
IEnumerableonDictionary<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мы внезапно изменили тип элемента, возвращаемого перечислителями.