Когда бы вы использовали список> вместо словаря?


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

7 62

7 ответов:

когда вам не нужно быстро искать ключ-поддержание хэш-таблицы, используемой 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.

поэтому вы всегда должны учитывать две, по крайней мере, две вещи:

  1. вы хотите искать конкретные детали внутри словарь?
  2. вы хотите иметь некоторые поля не является уникальным (например, пары: firstname/lastname).

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

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

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

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

отсюда

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

.

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

KeyValuePair и DictionaryEntry
[Кшиштоф Хвалина]

мы обсуждали проблему с реализация IEnumerable на 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 мы внезапно изменили тип элемент, возвращенный из перечислителей.