Когда использовать HashTable
В С# я использую List<T>
, IList<T>
или IEnumerable<T>
99% времени. Есть ли случай, когда было бы лучше использовать HashTable
(или Dictionary<T,T>
в 2.0 и выше) поверх этих?
Редактировать:
Как уже указывалось, то, что кто-то хотел бы сделать с коллекцией, часто диктует, что следует использовать, поэтому, когда бы вы использовали Hashtable
/Dictonary<T,T>
над List<T>
?
Ответы
Ответ 1
Возможно, не имеет прямого отношения к вопросу OPs, но есть полезное сообщение в блоге о том, какую структуру коллекции использовать по адресу: SortedSets
В принципе, то, что вы хотите сделать с коллекцией, определяет тип коллекции, которую вы должны создать.
Подводя итог более подробно:
- Используйте IList, если вы хотите иметь возможность перечислять и/или изменять коллекцию (обычно добавляя в конце списка)
- Используйте IEnumeration, если вы просто хотите перечислить коллекцию (не нужно добавлять/удалять - обычно используется как возвращаемый тип)
- Используйте IDictionary, если вы хотите получить доступ к элементам с помощью ключа (добавление/удаление элементов с помощью клавиши)
-
Используйте SortedSet, если вы хотите получить доступ к коллекции в предопределенном порядке (наиболее распространенное использование - доступ к коллекции в порядке)
-
В целом, используйте словарь, если вы хотите получать или изменять элементы по ключу в каком-либо конкретном порядке (предпочтительнее всего списка, как это обычно делается в порядке, предпочтительнее перечисления, поскольку вы не можете изменять перечисление, предпочитаете над хеш-таблицей поскольку это не строго типизировано, предпочитается по отсортированному списку, когда вам не нужны отсортированные ключи)
Ответ 2
Вы используете хэш-таблицу (словарь), когда хотите быстро найти доступ к элементу на основе ключа.
Если вы используете List, IList or IEnumerable
, как правило, это означает, что вы перебираете данные (ну, в случае с IEnumerable, это определенно означает это), а хеш-таблица не собирается ничего вам ничего делать. Теперь, если вы искали значение в одном списке и использовали его для доступа к данным в другом списке, это немного изменилось бы. Например:
- Найти позицию в списке Item foo.
- Позиция в списке для foo соответствует позиции в другом списке, который содержит Foo_Value.
- Доступ к позиции в списке секунд для получения Foo_Value.
Вот ссылка , описывающая разные типы данных.
Еще одна ссылка.
Ответ 3
Используйте hashtable
, когда вам нужно (быстро) искать элементы по ключу.
Конечно, вы можете искать в IList
IEnumerable
т.д. Соответствующий ключ, но это займет O (n) время, а не O (1) для Hashtable
или Dictionary
.
Ответ 4
Хэш-таблицы - хороший выбор, если вы часто делаете "для чего-то в коллекции", и вас не интересует порядок элементов в коллекции.
Хэш-таблицы - это индексы. Вы можете сохранить хеш-таблицу для индексации списка, так что вы можете сделать выбор для доступа к нему в порядке или случайным образом на основе ключа.
Ответ 5
На самом деле вы не сравниваете одни и те же вещи, когда я использую словарь, потому что я хочу искать данные, как правило, я хочу сохранить список объектов, и я хочу, чтобы их можно было быстро найти используя какой-то ключ.
Ответ 6
Я использую Hashtables довольно часто, чтобы отправлять коллекции ключей/значений в Javascript через методы страницы.
Словари хороши для кеширования, когда вам нужно получить объект с учетом его идентификатора, но не хотите, чтобы он попадал в базу данных: Предполагая, что ваша коллекция недостаточно велика, чтобы вызвать большое количество столкновений, и ваши данные нуждаются в поиске достаточно часто, чтобы IEnumerable был слишком медленным, словари могут дать достойное ускорение.
Ответ 7
Невозможно точно сказать, не знаю, для чего предназначена коллекция, но если элементы в вашей коллекции не уникальны, вы не можете использовать хеш-таблицу, так как в качестве ключа нечего использовать. Поэтому, возможно, эмпирическое правило, которое вы ищете, состоит в том, что если ваши члены все разные, и вы хотите вытащить отдельные экземпляры из ключа, используйте хэш-таблицу. Если у вас есть куча предметов, которые вы хотите обработать одинаково (например, сделать foreach на весь набор), используйте список.
Ответ 8
Hashtable оптимизирует поиск. Он вычисляет хэш каждого добавляемого ключа. Затем он использует этот хэш-код для быстрого поиска элемента. Это более старый тип .NET Framework. Он медленнее, чем общий тип словаря.