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