Хэш-таблица C# с примерами

⚡ Умное резюме

Хэш-таблица в C# — это коллекция из пространства имен System.Collections, которая хранит данные в виде пар ключ-значение, где каждый уникальный ключ соответствует значению, а ключ обеспечивает быстрый поиск этого сохраненного значения.

  • 📚 Пары ключ-значение: Хэш-таблица хранит два значения для каждого элемента: ключ и его значение, в отличие от стека или массива, где хранится одно значение.
  • Добавление элементов: Метод Add вставляет ключ и значение одновременно, при этом каждый ключ в хэш-таблице должен быть уникальным.
  • 👀 ContainsKey и ContainsValue: Эти методы возвращают true или false, что позволяет проверить, существует ли уже ключ или значение.
  • 🔁 Значения показаний: Свойство Keys в сочетании с ICollection или циклом DictionaryEntry позволяет последовательно считывать каждое сохраненное значение.
  • 🇧🇷 Методы и свойства: Функции «Удаление», «Очистка», «Подсчет», «Ключи» и «Значения» позволяют управлять содержимым хэш-таблицы и проверять его.
  • 🤖 Помощь ИИ: GitHub Copilot использует генератор кода на основе Hashtable, в то время как современные C# и ML.NET отдают предпочтение универсальному словарю Dictionary для типобезопасных данных типа «ключ-значение».

Хеш-таблица С#

Что такое хеш-таблица в C#?

Хэш-таблица — это специальная коллекция, которая используется для хранения элементов «ключ-значение». Таким образом, вместо хранения только одного значения, такого как стек, список массивов и очередь, хеш-таблица хранит два значения. Эти два значения образуют элемент хеш-таблицы.

Ниже приведены примеры того, как могут выглядеть значения хеш-таблицы.

{ "001" , ".Net" }
{ "002" , ".C#" }
{ "003" , "ASP.Net" }

Выше у нас есть 3 пары ключевых значений. Ключи каждого элемента — 001, 002 и 003 соответственно. Значения каждой пары ключ-значение: «. Net“, “C#” и “ASP.Net” соответственно.

Давайте рассмотрим операции, доступные для коллекции Hashtable, более подробно.

Объявление хеш-таблицы

Объявление Hashtable показано ниже. Hashtable создается с помощью типа данных Hashtable. Ключевое слово «new» используется для создания объекта Hashtable. Затем объект присваивается переменной ht.

Hashtable ht = new Hashtable()

Добавление элементов в хэш-таблицу

Метод Add используется для добавления элемента в очередь. Общий синтаксис оператора приведен ниже.

HashTable.add("key","value")

Пример 1:

Помните, что каждый элемент хеш-таблицы состоит из двух значений: одно — ключ, а другое — значение.

Теперь давайте посмотрим, как это работает на уровне кода. Весь приведенный ниже код будет записан в наше консольное приложение.

Код будет записан в наш файл Program.cs. В приведенной ниже программе мы напишем код, чтобы увидеть, как мы можем использовать вышеупомянутые методы.

Сейчас в нашем примере мы просто посмотрим, как мы можем создать хеш-таблицу, добавить в нее элементы и отобразить их соответствующим образом.

Хэш-таблица в C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   ICollection keys = ht.Keys;

   foreach (String k in keys)
   {
    Console.WriteLine(ht[k]);
   }
    Console.ReadKey();
   }
 }
}

Code Объяснение:-

  1. Сначала мы объявляем переменную хеш-таблицы, используя тип данных Hashtable, используя ключевое слово «New». Имя определяемой переменной — «ht».
  2. Затем мы добавляем элементы в хеш-таблицу с помощью метода Add. Помните, что нам нужно добавить элемент ключа и значения при добавлении чего-либо в хеш-таблицу.
  3. Не существует прямого способа отображения элементов хеш-таблицы.
    • Чтобы отобразить хеш-таблицу, нам сначала нужно получить список ключей (001, 002 и 003) из хеш-таблицы.
    • Это делается через интерфейс ICollection. Это специальный тип данных, который можно использовать для хранения ключей коллекций хеш-таблиц. Затем мы присваиваем ключи коллекции хеш-таблиц переменной «keys».
  4. Далее для каждого значения ключа мы получаем связанное значение в хеш-таблице с помощью оператора ht[k].

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

Выход:

Хэш-таблица в C#

Давайте рассмотрим еще несколько методов, доступных для хеш-таблиц.

СодержитКлюч

Этот метод используется для проверки наличия ключа в хеш-таблице. Ниже приведен общий синтаксис этого оператора. Оператор вернет true, если ключ существует, в противном случае он вернет значение false.

Hashtable.Containskey(key)

Содержит значение

Этот метод используется для проверки наличия значения в хеш-таблице. Ниже приведен общий синтаксис этого оператора. Оператор вернет true, если значение существует, в противном случае он вернет значение false.

Hashtable.ContainsValue(value)

Пример 2:

Давайте изменим код в нашем Консольное приложение чтобы продемонстрировать, как мы можем использовать методы «Containskey» и «ContainsValue».

Хэш-таблица в C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("001",".Net");
   ht.Add("002","C#");
   ht.Add("003","ASP.Net");

   Console.WriteLine(ht.ContainsKey("001"));
   Console.WriteLine(ht.ContainsValue("C#"));
   Console.ReadKey();
   }
 }
}

Code Объяснение:-

  1. Сначала мы используем метод containsKey, чтобы проверить, присутствует ли ключ в хеш-таблице. Этот метод вернет true, если ключ присутствует в хеш-таблице. Этот метод должен возвращать значение true, поскольку ключ существует в хеш-таблице.
  2. Затем мы используем метод containsValue, чтобы проверить, присутствует ли значение в хеш-таблице. Этот метод вернет «истину», поскольку значение существует в хеш-таблице.

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

Выход:

Хэш-таблица в C#

Из вывода вы можете ясно видеть, что искомый ключ и значение присутствуют в хеш-таблице.

Как пройтись циклом по хэш-таблице в C#

В приведенных выше примерах значения считываются из коллекции Keys, но обход хэш-таблицы можно выполнить более чистым способом. Цикл foreach по элементу DictionaryEntry позволяет получить ключ и значение каждого элемента за один проход, что является наиболее распространенным способом чтения хэш-таблицы.

Шаг 1) Создайте хэш-таблицу и добавьте в неё три пары ключ-значение.

Шаг 2) Пройдите циклом по хэш-таблице, используя переменную типа DictionaryEntry, затем прочитайте свойства Key и Value каждой записи.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Hashtable ht = new Hashtable();
   ht.Add("101", "Java");
   ht.Add("102", "Python");
   ht.Add("103", "Kotlin");

   foreach (DictionaryEntry entry in ht)
   {
    Console.WriteLine(entry.Key + " - " + entry.Value);
   }
   Console.ReadKey();
  }
 }
}

Code Объяснение:-

  1. Создается хэш-таблица с именем ht, и с помощью метода Add в нее вставляются три пары ключ-значение.
  2. Цикл foreach присваивает каждому элементу запись в словаре (DictionaryEntry), свойства Key и Value которой отображают две половины пары.

При запуске программа выводит значение каждого ключа рядом с его значением, например, 101 – JavaПоскольку хэш-таблица не сохраняет порядок добавления элементов, пары могут отображаться в другой последовательности, чем та, в которой они были добавлены. Чтобы прочитать только ключи, пройдите циклом по коллекции Keys, а чтобы прочитать только значения, пройдите циклом по коллекции Values.

Методы и свойства хэш-таблиц в C#

Класс Hashtable предоставляет небольшой набор методов и свойств, охватывающих практически все необходимые задачи, от добавления и удаления пар до проверки принадлежности и подсчета элементов. Наиболее полезные члены перечислены ниже.

Член Тип Описание
Добавить(ключ, значение) Способ доставки Вставляет новую пару ключ-значение; ключ должен быть уникальным.
Удалить(ключ) Способ доставки Удаляет элемент, соответствующий указанному ключу.
Ясно() Способ доставки Удаляет все пары ключ-значение из хэш-таблицы.
ContainsKey(key) Способ доставки Возвращает true, если указанный ключ присутствует.
ContainsValue(value) Способ доставки Возвращает true, если заданное значение присутствует.
Количество Свойства Получает количество сохраненных пар ключ-значение.
Ключи Свойства Возвращает коллекцию всех ключей.
Наши ценности Свойства Возвращает коллекцию всех значений.

Поскольку каждый ключ хешируется, ContainsKey и индексатор находят элемент практически за постоянное время, что и делает хэш-таблицу такой полезной для быстрого поиска.

Разница между хэш-таблицей и словарем в C#

Хэш-таблица и словарь хранят пары ключ-значение и оба относятся к более широкому семейству языков C#. коллекцииВажное различие заключается в типобезопасности, и именно это различие определяет, какой тип безопасности следует использовать в новом коде.

  • Тип безопасности: Хэш-таблица хранит каждый ключ и значение в виде объекта, тогда как словарь Это обобщенный тип, поэтому компилятор проверяет используемые вами типы.
  • Пространство имен: Хэш-таблица находится в System.Collections, а словарь — в System.Collections.Generic.
  • BoxING: Хэш-таблица хранит значения таких типов, как int, тогда как универсальный словарь хранит их напрямую, избегая этих затрат.
  • Производительность: Словарь обычно работает быстрее, потому что при чтении значения не требуется приведение типов из объекта.
  • Безопасность резьбы: Хэштаблица предлагает SyncHronized — это обертка для одного автора с множеством читателей, тогда как для параллельного выполнения кода обычно используется ConcurrentDictionary.

Для любого нового проекта рекомендуется использовать универсальный словарь (Dictionary), а неуниверсальная хэш-таблица (Hashtable) в основном встречается в более старом коде.

Часто задаваемые вопросы (FAQ)

Метод Remove удаляет элемент с заданным ключом и уменьшает значение Count на единицу. Если ключ отсутствует, ничего не происходит, поэтому сначала вызовите метод ContainsKey, если вам необходимо убедиться в наличии ключа.

Нет. Каждый ключ в хэш-таблице должен быть уникальным. Вызов метода Add с уже существующим ключом вызовет исключение ArgumentException. Однако вы можете сохранить одно и то же значение под несколькими разными ключами без каких-либо ошибок.

Хэш-таблица позволяет безопасно использовать один поток записи с множеством потоков чтения. Для нескольких потоков записи используйте хэш-таблицу в качестве обертки.SyncИспользуйте hronized или предпочтительнее ConcurrentDictionary из System.Collections.Concurrent, который обрабатывает одновременное чтение и запись без внешних блокировок.

Поиск значения по ключу в среднем занимает почти постоянное время O(1), поскольку ключ хешируется для определения своего сегмента. Серьезные коллизии хешей могут замедлить процесс, но это редкость при хорошо распределенных ключах.

Значение может быть нулевым, но ключ — нет. Передача ключа со значением null в функцию Add или индексатор вызовет исключение ArgumentNullException. Каждый ключ также должен быть уникальным и не должен изменяться во время хранения.

Хэш-таблица не хранит порядок, поэтому её нельзя отсортировать на месте. Скопируйте её ключи в список или ArrayList, отсортируйте этот список, а затем прочитайте значения по ключу. Отсортированный список автоматически сохраняет порядок своих элементов.

Да. GitHub Copilot записывает объявления Hashtable, вызовы Add и циклы DictionaryEntry из короткого комментария или имени метода. Часто он предлагает вместо этого использовать универсальный словарь Dictionary, поскольку это рекомендуемая коллекция для нового кода на C#.

В ML.NET обучающие данные передаются через типизированные коллекции и конвейер IDataView, а не через хэш-таблицу. Однако хэш-таблицы типа «ключ-значение» по-прежнему поддерживают поиск признаков, кодирование словаря и кэширование для модели машинного обучения.

Подведем итог этой публикации следующим образом: