C# Hashtable

Коллекции C#

В C# хеш-таблица (Hashtable) — это коллекция пар ключ-значение (key=>value), коллекция, которая хранит данные в форме, где ключи и значения могут быть любыми объектами.

Каждый элемент в хеш-таблице имеетkey=>valueДа, ключ используется для доступа к элементам в коллекции.

Хеш-таблицы и доступ к данным на основе хеш-алгоритмов обеспечивают эффективные операции поиска, вставки и удаления.

Hashtableнеобобщённая коллекция, расположенная в пространстве имёнSystem.Collectionsв. Если нужна обобщённая коллекция, можно использоватьDictionary<TKey, TValue>。

Основная структура:

  • Клавиша(Key): для идентификации каждого элемента данных, должен бытьnull。
  • Значение(Valueданные, соответствующие ключу, могут бытьnull。

Возможности:

  • Пары ключ-значение: ключ уникален и связан со значением.
  • Хеш-алгоритм: определяет позиции хранения данных с помощью хеш-кода ключа; средняя временная сложность операций поиска и вставки — O(1).
  • Динамическое изменение ёмкости: когда количество элементов в хеш-таблице превышает ёмкость, таблица динамически расширяется и перераспределяет память.
  • Неупорядоченное хранение: порядок хранения пар ключ-значение не зависит от порядка вставки и определяется хеш-кодом.

Методы и свойства класса Hashtable

В таблице ниже перечисленыHashtableнекоторые часто используемые в классесвойства.:

Имя атрибутаTypeОписание
CountintВозвращает количество пар ключ-значение, содержащихся в хеш-таблице.
IsReadOnlyboolУказывает, доступна ли хеш-таблица только для чтения.
IsFixedSizeboolУказывает, имеет ли хеш-таблица фиксированный размер.
IsSynchronizedboolУказывает, является ли хеш-таблица потокобезопасной.
KeysICollectionВозвращает коллекцию всех ключей в хеш-таблице.
ValuesICollectionВозвращает коллекцию всех значений в хеш-таблице.
SyncRootobjectВозвращает объект, который можно использовать для синхронизации доступа к хеш-таблице.

В таблице ниже перечисленыHashtableнекоторые часто используемые методы классаМетоды:

Название методаТип возвращаемого значенияОписание
Добавление и удаление
Add(object key, object value)voidДобавляет указанную пару ключ-значение в хеш-таблицу.
Clear()voidОчищает хеш-таблицу.
Remove(object key)voidУдаляет пару ключ-значение с указанным ключом.
Запрос и доступ
Contains(object key)boolОпределяет, содержит ли хеш-таблица указанный ключ.
ContainsKey(object key)boolОпределяет, содержит ли хеш-таблица указанный ключ (эквивалентноContains)。
ContainsValue(object value)boolОпределяет, содержит ли хеш-таблица указанное значение.
Копирование и перечисление
CopyTo(Array array, int index)voidКопирует элементы хеш-таблицы в массив, начиная с указанного индекса.
GetEnumerator()IDictionaryEnumeratorВозвращает перечислитель для хеш-таблицы, используемый для перебора пар ключ-значение.

Пример

В следующем примере демонстрируется концепция Hashtable:

Пример

using System;
using System.Collections;

namespace CollectionsApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         Hashtable ht = new Hashtable();


         ht.Add("001", "Zara Ali");
         ht.Add("002", "Abida Rehman");
         ht.Add("003", "Joe Holzner");
         ht.Add("004", "Mausam Benazir Nur");
         ht.Add("005", "M. Amlan");
         ht.Add("006", "M. Arif");
         ht.Add("007", "Ritesh Saikia");

         if (ht.ContainsValue("Nuha Ali"))
         {
            Console.WriteLine("Это имя студента уже есть в списке");
         }
         else
         {
            ht.Add("008", "Nuha Ali");
         }
         // Получить коллекцию ключей
         ICollection key = ht.Keys;

         foreach (string k in key)
         {
            Console.WriteLine(k + ": " + ht[k]);
         }
         Console.ReadKey();
      }
   }
}

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

007: Ritesh Saikia
004: Mausam Benazir Nur
005: M. Amlan
008: Nuha Ali
002: Abida Rehman
003: Joe Holzner
001: Zara Ali
006: M. Arif

Сравнение с другими коллекциями

ОсобенностиHashtableDictionary<TKey, TValue>
ТипобезопасностьНет (необобщённая, хранитobjectхранения)Да (обобщённая, строго типизированные ограничения)
ПроизводительностьМедленнее (требует операций упаковки и распаковки)Быстрее (нет операций упаковки, обобщения напрямую поддерживают типы)
Уникальность ключейДаДа
Может ли значение бытьnullДаДа
СортировкаОтсутствуетОтсутствует
ПотокобезопасностьПо умолчанию не является потокобезопаснымПо умолчанию не является потокобезопасным
  • HashtableЯвляется эффективной коллекцией пар ключ-значение, подходящей для сценариев, требующих быстрого хранения и извлечения пар ключ-значение.
  • необобщённаяЕё дизайн делает её уступающей обобщённым коллекциям с точки зрения типобезопасности и производительности (например,Dictionary<TKey, TValue>)。
  • В современной разработке на C#,Dictionary<TKey, TValue>Используется чаще, ноHashtableОна всё ещё подходит для простых приложений или сценариев, совместимых с устаревшим кодом.

Коллекции C#

Другие расширения