C# Hashtable с примери

⚡ Умно обобщение

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

  • ???? Двойки ключ-стойност: Хеш таблицата съхранява две стойности на елемент - ключ и неговата стойност, вместо единичната стойност, съхранявана от стек или масив.
  • Добавяне на елементи: Методът Add вмъква ключ и стойност заедно и всеки ключ в Hashtable трябва да е уникален.
  • 👀 СъдържаКлюч и СъдържаСтойност: Тези методи връщат true или false, така че можете да проверите дали ключ или стойност вече съществува.
  • 🔁 Стойности на отчитане: Свойството Keys с цикъл ICollection или DictionaryEntry ви позволява да четете всяка съхранена стойност поред.
  • 🛠️ Методи и свойства: Премахване, Изчистване, Броене, Ключове и Стойности управляват и проверяват съдържанието на Hashtable.
  • 🤖 AI помощ: GitHub Copilot използва Hashtable код, докато съвременните C# и ML.NET предпочитат генеричния Dictionary за безопасни по отношение на типа ключови стойности.

C# Hashtable

Какво е Hashtable в C#?

Хеш таблицата е специална колекция, която се използва за съхраняване на елементи ключ-стойност. Така че вместо да съхранява само една стойност като стека, списъка с масиви и опашката, хеш-таблицата съхранява 2 стойности. Тези 2 стойности образуват елемент от хеш-таблицата.

По-долу са някои примери за това как могат да изглеждат стойностите на хеш-таблица.

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

По-горе имаме 3 двойки ключови стойности. Ключовете на всеки елемент са съответно 001, 002 и 003. Стойностите на всяка двойка ключ стойност са ".Net“, съответно „C#“ и „ASP.Net“.

Нека разгледаме по-подробно операциите, налични за колекцията Hashtable.

Декларация на Hashtable

Декларацията на Hashtable е показана по-долу. Hashtable се създава с помощта на Hashtable Datatype. Ключовата дума „new“ се използва за създаване на обект на Hashtable. След това обектът се присвоява на променливата ht.

Hashtable ht = new Hashtable()

Добавяне на елементи към 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#

Нека разгледаме още някои налични методи за хеш таблици.

Съдържа ключ

Този метод се използва, за да се види дали има ключ в Hashtable. По-долу е общият синтаксис на този израз. Изявлението ще върне 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Тъй като Hashtable не запазва реда на вмъкване, двойките може да се появят в различна последователност от тази, в която са били добавени. За да прочетете само ключовете, преминете през колекцията Keys, а за да прочетете само стойностите, преминете през колекцията Values.

C# методи и свойства на хеш таблици

Класът Hashtable предоставя малък набор от методи и свойства, които покриват почти всяка задача, от която ще ви е необходима, от добавяне и премахване на двойки до проверка на членството и броене на елементи. Най-полезните членове са изброени по-долу.

Член Тип Descriptйон
Добавяне (ключ, стойност) Начин на доставка Вмъква нова двойка ключ и стойност; ключът трябва да е уникален.
Премахване (ключ) Начин на доставка Изтрива елемента, който съответства на зададения ключ.
Изчисти() Начин на доставка Премахва всяка двойка ключ-стойност от хеш таблицата.
СъдържаКлюч(ключ) Начин на доставка Връща true, когато даденият ключ е наличен.
СъдържаСтойност(стойност) Начин на доставка Връща true, когато дадената стойност е налична.
Броя Имот Връща броя на съхранените двойки ключ-стойност.
Keys Имот Връща колекция от всички ключове.
Ценности Имот Връща колекция от всички стойности.

Тъй като всеки ключ е хеширан, ContainsKey и индексаторът локализират елемент за почти константно време, което прави Hashtable толкова полезен за бързи търсения.

Разлика между хеш-таблица и речник в C#

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

  • Безопасност на типа: Хеш таблицата съхранява всеки ключ и стойност като обект, докато речникът е генеричен, така че компилаторът проверява типовете, които използвате.
  • Именно пространство: Hashtable се намира в System.Collections, докато Dictionary се намира в System.Collections.Generic.
  • BoxING: Хеш таблицата съхранява стойности от типове като int, но обобщеният речник ги съхранява директно и избягва този разход.
  • Изпълнение: Речникът обикновено е по-бърз, защото не е необходимо обратно преобразуване от обект, когато четете стойност.
  • Безопасност на нишките: Hashtable предлага Syncхронизирана обвивка за един писател с много четци, докато едновременният код обикновено избира ConcurrentDictionary.

За всеки нов проект, общият Dictionary е препоръчителният избор, а негенеричният Hashtable се появява главно в по-стар код.

Въпроси и Отговори

Методът Remove изтрива елемента с даден ключ и намалява Count с едно. Ако ключът не съществува, нищо не се случва, така че първо извикайте ContainsKey, когато трябва да сте сигурни, че ключът е наличен.

Не. Всеки ключ в Hashtable трябва да е уникален. Извикването на Add с ключ, който вече съществува, хвърля ArgumentException. Можете обаче да съхраните една и съща стойност под няколко различни ключа без никаква грешка.

Хештаблицата поддържа безопасно един писател с много читатели. За няколко нишки на писане, обвийте я с Hashtable.Syncхронизирано или предпочитате ConcurrentDictionary от System.Collections.Concurrent, който обработва едновременни четения и записи без външни заключвания.

Търсенето на стойност по ключ се извършва средно за почти константно време O(1), защото ключът се хешира, за да се намери неговата група. Тежките хеш колизии могат да го забавят, но това е рядкост при добре разпределени ключове.

Стойността може да е null, но ключът не може. Предаването на null ключ на Add или индексатора хвърля ArgumentNullException. Всеки ключ също трябва да е уникален и не трябва да се променя, докато се съхранява.

Хеш таблицата не поддържа ред, така че не може да бъде сортирана на място. Копирайте ключовете ѝ в списък или ArrayList, сортирайте този списък и след това прочетете стойностите по ключ. SortedList поддържа записите си подредени автоматично.

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

Данните за обучение на ML.NET преминават през типизирани колекции и конвейера IDataView, а не през Hashtable. Въпреки това, картите ключ-стойност, базирани на хеш, все още поддържат търсене на функции, кодиране на речник и кеширане около модел на машинно обучение.

Обобщете тази публикация с: