Подтвердить что ты не робот

Когда использовать HashTable

В С# я использую List<T>, IList<T> или IEnumerable<T> 99% времени. Есть ли случай, когда было бы лучше использовать HashTable (или Dictionary<T,T> в 2.0 и выше) поверх этих?

Редактировать:

Как уже указывалось, то, что кто-то хотел бы сделать с коллекцией, часто диктует, что следует использовать, поэтому, когда бы вы использовали Hashtable/Dictonary<T,T> над List<T>?

4b9b3361

Ответ 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. Он медленнее, чем общий тип словаря.