C# Hashtable
В C# хеш-таблица (Hashtable) — это коллекция пар ключ-значение (key=>value), коллекция, которая хранит данные в форме, где ключи и значения могут быть любыми объектами.
Каждый элемент в хеш-таблице имеетkey=>valueДа, ключ используется для доступа к элементам в коллекции.
Хеш-таблицы и доступ к данным на основе хеш-алгоритмов обеспечивают эффективные операции поиска, вставки и удаления.
Hashtableнеобобщённая коллекция, расположенная в пространстве имёнSystem.Collectionsв. Если нужна обобщённая коллекция, можно использоватьDictionary<TKey, TValue>。
Основная структура:
- Клавиша(
Key): для идентификации каждого элемента данных, должен бытьnull。 - Значение(
Valueданные, соответствующие ключу, могут бытьnull。
Возможности:
- Пары ключ-значение: ключ уникален и связан со значением.
- Хеш-алгоритм: определяет позиции хранения данных с помощью хеш-кода ключа; средняя временная сложность операций поиска и вставки — O(1).
- Динамическое изменение ёмкости: когда количество элементов в хеш-таблице превышает ёмкость, таблица динамически расширяется и перераспределяет память.
- Неупорядоченное хранение: порядок хранения пар ключ-значение не зависит от порядка вставки и определяется хеш-кодом.
Методы и свойства класса Hashtable
В таблице ниже перечисленыHashtableнекоторые часто используемые в классесвойства.:
| Имя атрибута | Type | Описание |
|---|---|---|
Count | int | Возвращает количество пар ключ-значение, содержащихся в хеш-таблице. |
IsReadOnly | bool | Указывает, доступна ли хеш-таблица только для чтения. |
IsFixedSize | bool | Указывает, имеет ли хеш-таблица фиксированный размер. |
IsSynchronized | bool | Указывает, является ли хеш-таблица потокобезопасной. |
Keys | ICollection | Возвращает коллекцию всех ключей в хеш-таблице. |
Values | ICollection | Возвращает коллекцию всех значений в хеш-таблице. |
SyncRoot | object | Возвращает объект, который можно использовать для синхронизации доступа к хеш-таблице. |
В таблице ниже перечислены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();
}
}
}
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
Сравнение с другими коллекциями
| Особенности | Hashtable | Dictionary<TKey, TValue> |
|---|---|---|
| Типобезопасность | Нет (необобщённая, хранитobjectхранения) | Да (обобщённая, строго типизированные ограничения) |
| Производительность | Медленнее (требует операций упаковки и распаковки) | Быстрее (нет операций упаковки, обобщения напрямую поддерживают типы) |
| Уникальность ключей | Да | Да |
Может ли значение бытьnull | Да | Да |
| Сортировка | Отсутствует | Отсутствует |
| Потокобезопасность | По умолчанию не является потокобезопасным | По умолчанию не является потокобезопасным |
HashtableЯвляется эффективной коллекцией пар ключ-значение, подходящей для сценариев, требующих быстрого хранения и извлечения пар ключ-значение.- необобщённаяЕё дизайн делает её уступающей обобщённым коллекциям с точки зрения типобезопасности и производительности (например,
Dictionary<TKey, TValue>)。 - В современной разработке на C#,
Dictionary<TKey, TValue>Используется чаще, ноHashtableОна всё ещё подходит для простых приложений или сценариев, совместимых с устаревшим кодом.