Хеш-таблиця C# із прикладами

⚡ Розумний підсумок

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

  • 📚 Пари ключ-значення: Хеш-таблиця зберігає два значення для кожного елемента: ключ та його значення, замість одного значення, що зберігається у стеку або масиві.
  • Додавання елементів: Метод Add вставляє ключ і значення разом, і кожен ключ усередині Hashtable має бути унікальним.
  • ???? МіститьКлюч та МіститьЗначення: Ці методи повертають значення true або false, щоб ви могли перевірити, чи вже існує ключ або значення.
  • 🔁 Значення зчитування: Властивість Keys з циклом ICollection або DictionaryEntry дозволяє зчитувати кожне збережене значення по черзі.
  • 🛠️ Методи та властивості: Видалення, Очищення, Підрахунок, Ключі та Значення керують та перевіряють вміст хеш-таблиці.
  • 🤖 Допомога AI: GitHub Copilot використовує код Hashtable, тоді як сучасні C# та ML.NET надають перевагу загальному словнику для типобезпечних даних ключ-значення.

Хеш-таблиця C#

Що таке Hashtable у C#?

Хеш-таблиця — це спеціальна колекція, яка використовується для зберігання елементів типу "ключ-значення". Тож замість того, щоб зберігати лише одне значення, наприклад стек, список масивів і чергу, хеш-таблиця зберігає 2 значення. Ці 2 значення утворюють елемент хеш-таблиці.

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

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

Вище ми маємо 3 пари ключ-значення. Ключі кожного елемента 001, 002 і 003 відповідно. Значення кожної пари ключ-значення є «.Net“, “C#” та “ASP.Net” відповідно.

Давайте детальніше розглянемо операції, доступні для колекції Hashtable.

Оголошення хеш-таблиці

Оголошення хеш-таблиці показано нижче. Hashtable створюється за допомогою типу даних Hashtable. Ключове слово “new” використовується для створення об’єкта хеш-таблиці. Потім об’єкт присвоюється змінній ht.

Hashtable ht = new Hashtable()

Додавання елементів до хеш-таблиці

Метод Add використовується для додавання елемента до чергу. Загальний синтаксис оператора наведено нижче

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

Приклад 1:

Пам’ятайте, що кожен елемент хеш-таблиці складається з 2 значень, одне є ключем, а інше – значенням.

Тепер давайте подивимося, як це працює на рівні коду. Весь наведений нижче код буде записано в нашу консольну програму.

Код буде записаний у наш файл 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 за допомогою типу даних 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, щоб перевірити, чи присутнє значення в хеш-таблиці. Цей метод поверне «true», оскільки значення дійсно існує в хеш-таблиці.

Якщо наведений вище код введено належним чином і програма запущена, буде показано наступний результат.

вихід:

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

З результату ви можете чітко побачити, що і ключ, і значення, які шукаються, присутні в хеш-таблиці.

Як перебрати хеш-таблицю в C#

У наведених вище прикладах значення зчитуються через колекцію Keys, але Hashtable можна обійти більш чітким способом. Цикл foreach над DictionaryEntry передає вам ключ і значення кожного елемента разом за один прохід, що є найпоширенішим способом зчитування Hashtable.

Крок 1) Створіть хеш-таблицю та додайте до неї три пари ключ-значення.

Крок 2) Переберіть Hashtable зі змінною 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(ключ) Метод Повертає значення true, коли заданий ключ присутній.
МіститьЗначення(значення) Метод Повертає значення true, коли задане значення присутнє.
Рахувати властивість Отримує кількість збережених пар ключ-значення.
Ключі властивість Повертає колекцію всіх ключів.
Цінності властивість Повертає колекцію всіх значень.

Оскільки кожен ключ хешується, ContainsKey та індексатор знаходять елемент майже за постійний час, що робить Hashtable таким корисним для швидкого пошуку.

Різниця між хеш-таблицею та словником у C#

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

  • Безпека типу: Хеш-таблиця зберігає кожен ключ і значення як об'єкт, тоді як словник є узагальненим, тому компілятор перевіряє типи, які ви використовуєте.
  • Простір імен: Хеш-таблиця знаходиться в System.Collections, тоді як словник знаходиться в System.Collections.Generic.
  • Boxing: Хеш-таблиця містить значення таких типів, як int, але загальний словник зберігає їх безпосередньо та уникає цих витрат.
  • Продуктивність: Словник зазвичай швидший, оскільки йому не потрібно повертати типи з об'єкта під час читання значення.
  • Безпека потоків: Hashtable пропонує Syncхронізована обгортка для одного автора з багатьма читачами, тоді як паралельний код зазвичай обирає ConcurrentDictionary.

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

Поширені запитання

Метод Remove видаляє елемент із заданим ключем та зменшує значення Count на одиницю. Якщо ключа не існує, нічого не відбувається, тому спочатку викличте ContainsKey, коли вам потрібно переконатися, що ключ присутній.

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

Хеш-таблиця безпечно підтримує одного автора з багатьма читачами. Для кількох потоків запису обгорніть її за допомогою Хеш-таблиці.Syncхронізовано, або надайте перевагу ConcurrentDictionary з System.Collections.Concurrent, який обробляє одночасне читання та запис без зовнішніх блокувань.

Пошук значення за ключем виконується в середньому майже постійно O(1), оскільки ключ хешується для визначення свого сегмента. Значні колізії хешування можуть уповільнити його роботу, але це рідко трапляється з добре розподіленими ключами.

Значення може бути null, але ключ – ні. Передача null-ключа до Add або індексатора викликає виняток ArgumentNullException. Кожен ключ також має бути унікальним і не повинен змінюватися під час зберігання.

Хеш-таблиця не зберігає порядок, тому її не можна відсортувати на місці. Скопіюйте її ключі в список або ArrayList, відсортуйте цей список, а потім зчитайте значення за ключем. SortedList автоматично упорядковує свої записи.

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

Навчальні дані ML.NET проходять через типізовані колекції та конвеєр IDataView, а не через Hashtable. Однак, карти ключ-значення на основі хешування все ще підтримують пошук ознак, кодування словника та кешування навколо моделі машинного навчання.

Підсумуйте цей пост за допомогою: