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

Какво е 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. В програмата по-долу ще напишем кода, за да видим как можем да използваме гореспоменатите методи.
Засега в нашия пример просто ще разгледаме как можем да създадем хеш-таблица, да добавим елементи към хеш-таблицата и да ги покажем съответно.
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 Обяснение:
- Първо, ние декларираме променливата на hashtable, използвайки типа данни Hashtable, като използваме ключовата дума „New“. Името на дефинираната променлива е „ht“.
- След това добавяме елементи към хеш-таблицата с помощта на метода Add. Не забравяйте, че трябва да добавим както ключ, така и стойностен елемент, когато добавяме нещо към хеш-таблицата.
- Няма директен начин за показване на елементите на хеш-таблица.
- За да покажем хеш-таблицата, първо трябва да вземем списъка с ключове (001, 002 и 003) от хеш-таблицата.
- Това става чрез интерфейса на ICollection. Това е специален тип данни, който може да се използва за съхраняване на ключовете на колекции от хеш-таблици. След това присвояваме ключовете на колекцията от хеш-таблици на променливата 'keys'.
- След това за всяка ключова стойност получаваме свързаната стойност в хеш-таблицата, като използваме оператора ht[k].
Ако горният код е въведен правилно и програмата се изпълнява, ще се покаже следният изход.
Изход:
Нека разгледаме още някои налични методи за хеш таблици.
Съдържа ключ
Този метод се използва, за да се види дали има ключ в Hashtable. По-долу е общият синтаксис на този израз. Изявлението ще върне true, ако ключът съществува, в противен случай ще върне стойността false.
Hashtable.Containskey(key)
Съдържа Стойност
Този метод се използва, за да се види дали дадена стойност присъства в хеш-таблицата. По-долу е общият синтаксис на този израз. Изявлението ще върне true, ако стойността съществува, в противен случай ще върне стойността false.
Hashtable.ContainsValue(value)
Пример 2:
Нека променим кода в нашия Конзолно приложение за да покажем как можем да използваме метода „Containskey“ и „ContainsValue“.
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 Обяснение:
- Първо използваме метода ContainsKey, за да видим дали ключът присъства в хеш-таблицата. Този метод ще върне true, ако ключът присъства в хеш-таблицата. Този метод трябва да върне true, тъй като ключът съществува в хеш-таблицата.
- След това използваме метода ContainsValue, за да видим дали стойността присъства в хеш-таблицата. Този метод ще върне „true“, тъй като стойността съществува в хеш-таблицата.
Ако горният код е въведен правилно и програмата се изпълнява, ще се покаже следният изход.
Изход:
От изхода можете ясно да видите, че и ключът, и стойността, които се търсят, присъстват в хеш-таблицата.
Как да се премине през 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 Обяснение:
- Създава се хеш таблица с име ht и три двойки ключ-стойност се вмъкват с метода Add.
- Цикълът 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 се появява главно в по-стар код.




