Когда бы вы использовали список> вместо словаря?
в чем разница между списком KeyValuePair и словарем для одних и тех же типов? Есть ли подходящее время для использования одного или другого?
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.
поэтому вы всегда должны учитывать две, по крайней мере, две вещи:
- вы хотите искать конкретные детали внутри словарь?
- вы хотите иметь некоторые поля не является уникальным (например, пары: 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
мы внезапно изменили тип элемент, возвращенный из перечислителей.