C# Hashtable s primjerima

⚡ Pametni sažetak

Hashtable u C# je kolekcija iz imenskog prostora System.Collections koja pohranjuje podatke kao parove ključ-vrijednost, gdje se svaki jedinstveni ključ mapira na vrijednost, a ključ omogućuje brzo pretraživanje te pohranjene vrijednosti.

  • 📚 Parovi ključ-vrijednost: Hashtable pohranjuje dvije vrijednosti po elementu, ključ i njegovu vrijednost, umjesto jedne vrijednosti koju sadrži stog ili niz.
  • ➕ Dodavanje elemenata: Metoda Add umeće ključ i vrijednost zajedno, a svaki ključ unutar Hashtable-a mora biti jedinstven.
  • 👀 SadržiKljuč i SadržiVrijednost: Ove metode vraćaju vrijednost true ili false tako da možete provjeriti postoji li već ključ ili vrijednost.
  • 🔁 Očitane vrijednosti: Svojstvo Keys s ICollection ili petljom DictionaryEntry omogućuje vam redom čitanje svake pohranjene vrijednosti.
  • 🛠️ Metode i svojstva: Uklanjanje, Brisanje, Brojanje, Ključevi i Vrijednosti upravljaju i pregledavaju sadržaj Hashtable-a.
  • 🤖 AI pomoć: GitHub Copilot scaffoldira Hashtable kod, dok moderni C# i ML.NET favoriziraju generički rječnik za tipski sigurne podatke ključ-vrijednost.

C# Raspršena tablica

Što je Hashtable u C#?

Raspršena tablica je posebna kolekcija koja se koristi za pohranu stavki ključ-vrijednost. Dakle, umjesto pohranjivanja samo jedne vrijednosti kao stog, popis polja i red čekanja, hash tablica pohranjuje 2 vrijednosti. Ove 2 vrijednosti čine element hash tablice.

Ispod su neki primjeri kako bi vrijednosti hash tablice mogle izgledati.

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

Gore imamo 3 para ključeva vrijednosti. Ključevi svakog elementa su redom 001, 002 i 003. Vrijednosti svakog para ključ vrijednosti su ".Neto“, “C#” odnosno “ASP.Net”.

Pogledajmo detaljnije operacije dostupne za kolekciju Hashtable.

Deklaracija Hashtable

Deklaracija Hashtable prikazana je u nastavku. Hashtable se kreira uz pomoć tipa podataka Hashtable. Ključna riječ "new" koristi se za stvaranje objekta Hashtable. Objekt se tada dodjeljuje varijabli ht.

Hashtable ht = new Hashtable()

Dodavanje elemenata u Hashtable

Metoda Add koristi se za dodavanje elementa na red. Opća sintaksa izjave data je u nastavku

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

Primjer 1:

Zapamtite da se svaki element hash tablice sastoji od 2 vrijednosti, jedna je ključ, a druga je vrijednost.

Sada, da vidimo kako ovo radi na razini koda. Sav dolje navedeni kod bit će zapisan u našu konzolnu aplikaciju.

Kod će biti zapisan u našu datoteku Program.cs. U donjem programu napisat ćemo kod da vidimo kako možemo koristiti gore navedene metode.

Za sada ćemo u našem primjeru samo pogledati kako možemo stvoriti hash tablicu, dodati elemente u hash tablicu i prikazati ih u skladu s tim.

Raspršena tablica u 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 Obrazloženje:-

  1. Prvo, deklariramo varijablu hashtable koristeći tip podataka Hashtable koristeći ključnu riječ "New". Naziv definirane varijable je 'ht'.
  2. Zatim dodajemo elemente u hash tablicu pomoću metode Add. Ne zaboravite da moramo dodati i ključ i element vrijednosti kada nešto dodajemo u hash tablicu.
  3. Ne postoji izravan način za prikaz elemenata hash tablice.
    • Kako bismo prikazali hash tablicu, prvo moramo dobiti popis ključeva (001, 002 i 003) iz hash tablice.
    • To se radi preko ICollection sučelja. Ovo je poseban tip podataka koji se može koristiti za pohranjivanje ključeva kolekcija hashtable. Zatim ključeve zbirke hashtable dodjeljujemo varijabli 'keys'.
  4. Zatim za svaku vrijednost ključa dobivamo pridruženu vrijednost u tablici raspršivanja korištenjem izjave ht[k].

Ako se gornji kod ispravno unese i program se pokrene, prikazat će se sljedeći izlaz.

Izlaz:

Raspršena tablica u C#

Pogledajmo još neke metode dostupne za hash tablice.

SadržiKljuč

Ova se metoda koristi da se vidi je li ključ prisutan u tablici raspršivanja. Ispod je opća sintaksa ove izjave. Naredba će vratiti true ako ključ postoji, inače će vratiti vrijednost false.

Hashtable.Containskey(key)

SadržiVrijednost

Ova se metoda koristi da se vidi je li vrijednost prisutna u tablici raspršivanja. Ispod je opća sintaksa ove izjave. Naredba će vratiti true ako vrijednost postoji, inače će vratiti vrijednost false.

Hashtable.ContainsValue(value)

Primjer 2:

Promijenimo kod u našem Konzolna aplikacija kako bismo pokazali kako možemo koristiti metode "Containskey" i "ContainsValue".

Raspršena tablica u 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 Obrazloženje:-

  1. Prvo koristimo metodu ContainsKey da vidimo je li ključ prisutan u hash tablici. Ova metoda će vratiti true ako je ključ prisutan u hash tablici. Ova bi metoda trebala vratiti true budući da ključ postoji u hash tablici.
  2. Zatim koristimo metodu ContainsValue da vidimo je li vrijednost prisutna u hash tablici. Ova će metoda vratiti 'true' budući da vrijednost postoji u tablici raspršivanja.

Ako se gornji kod ispravno unese i program se pokrene, prikazat će se sljedeći izlaz.

Izlaz:

Raspršena tablica u C#

Iz izlaza možete jasno vidjeti da su i ključ i vrijednost koji se pretražuju prisutni u hash tablici.

Kako proći kroz C# Hashtable

Gornji primjeri čitaju vrijednosti kroz kolekciju Keys, ali Hashtable se može obraditi na čišći način. Petlja foreach iznad DictionaryEntry vam predaje ključ i vrijednost svakog elementa zajedno u jednom prolazu, što je najčešći način čitanja Hashtable-a.

Korak 1) Napravite Hashtable i dodajte mu tri para ključ-vrijednost.

Korak 2) Prođite kroz Hashtable s varijablom DictionaryEntry, a zatim pročitajte svojstva Key i Value svakog unosa.

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 Obrazloženje:-

  1. Stvara se Hashtable pod nazivom ht, a tri para ključ-vrijednost ubacuju se metodom Add.
  2. Petlja foreach dodjeljuje svaki element objektu DictionaryEntry, čija svojstva Key i Value otkrivaju dvije polovice para.

Kada se program pokrene, ispisuje svaki ključ pored njegove vrijednosti, kao što je 101 – JavaBudući da Hashtable ne zadržava redoslijed umetanja, parovi se mogu pojaviti u drugačijem redoslijedu od onog u kojem su dodani. Za čitanje samo ključeva, petljom prijeđite preko kolekcije Keys, a za čitanje samo vrijednosti, petljom prijeđite preko kolekcije Values.

C# metode i svojstva hashtable-a

Klasa Hashtable nudi mali skup metoda i svojstava koja pokrivaju gotovo svaki zadatak koji će vam trebati, od dodavanja i uklanjanja parova do provjere članstva i brojanja elemenata. Najkorisniji članovi navedeni su u nastavku.

Član Tip Description
Dodaj(ključ, vrijednost) način Umeće novi par ključa i vrijednosti; ključ mora biti jedinstven.
Ukloni (ključ) način Briše element koji odgovara navedenom ključu.
Čisto() način Uklanja svaki par ključ-vrijednost iz Hashtable-a.
SadržiKljuč(ključ) način Vraća vrijednost true kada je zadani ključ prisutan.
SadržiVrijednost(vrijednost) način Vraća vrijednost true kada je zadana vrijednost prisutna.
Računati Svojstvo Vraća broj pohranjenih parova ključ-vrijednost.
Tipke Svojstvo Vraća kolekciju svih ključeva.
Vrijednosti Svojstvo Vraća kolekciju svih vrijednosti.

Budući da je svaki ključ hashiran, ContainsKey i indekser lociraju element u gotovo konstantnom vremenu, što Hashtable čini tako korisnim za brze pretrage.

Razlika između hashtablea i rječnika u C#

Hashtable i Dictionary pohranjuju parove ključ-vrijednost i oba pripadaju široj obitelji C#. kolekcijeVažna razlika je sigurnost tipova, a ta razlika odlučuje koji biste trebali koristiti u novom kodu.

  • Sigurnost tipa: Hashtable pohranjuje svaki ključ i vrijednost kao objekt, dok Dictionary je generički, pa kompajler provjerava tipove koje koristite.
  • Prostor: Hashtable se nalazi u System.Collections, dok se Dictionary nalazi u System.Collections.Generic.
  • BoxING: Hashtable pohranjuje tipove vrijednosti kao što je int, ali generički rječnik ih pohranjuje izravno i izbjegava taj trošak.
  • Performance: Rječnik je obično brži jer ne treba vraćanje vrijednosti iz objekta kada se čita vrijednost.
  • Sigurnost niti: Hashtable nudi Synckronizirani omotač za jednog pisca s mnogo čitatelja, dok konkurentni kod obično odabire ConcurrentDictionary.

Za svaki novi projekt, generički Dictionary je preporučeni izbor, a negenerički Hashtable se uglavnom pojavljuje u starijem kodu.

Pitanja i odgovori

Metoda Remove briše element s danim ključem i smanjuje Count za jedan. Ako ključ ne postoji, ništa se ne događa, stoga prvo pozovite ContainsKey kada morate biti sigurni da je ključ prisutan.

Ne. Svaki ključ u Hashtableu mora biti jedinstven. Pozivanje Add s ključem koji već postoji izbacuje ArgumentException. Međutim, istu vrijednost možete pohraniti pod nekoliko različitih ključeva bez ikakve greške.

Hashtable sigurno podržava jednog pisca s mnogo čitatelja. Za nekoliko niti pisanja, omotajte ga pomoću Hashtablea.Synckronizirano ili preferirati ConcurrentDictionary iz System.Collections.Concurrent, koji obrađuje istodobna čitanja i pisanja bez vanjskih zaključavanja.

Traženje vrijednosti po ključu u prosjeku traje gotovo konstantno O(1) vrijeme, jer se ključ hashira kako bi se pronašla njegova "spremnik". Veliki sudari hashiranja mogu ga usporiti, ali to je rijetko s dobro distribuiranim ključevima.

Vrijednost može biti null, ali ključ ne može. Prosljeđivanje null ključa funkciji Add ili indekseru izbacuje iznimku ArgumentNullException. Svaki ključ također mora biti jedinstven i ne smije se mijenjati dok se pohranjuje.

Hashtable ne održava redoslijed, pa se ne može sortirati na mjestu. Kopirajte njegove ključeve u listu ili ArrayList, sortirajte tu listu, a zatim pročitajte vrijednosti po ključu. SortedList automatski održava redoslijed svojih unosa.

Da. GitHub Copilot piše deklaracije Hashtable-a, pozive Add-a i petlje DictionaryEntry iz kratkog komentara ili naziva metode. Često umjesto toga predlaže generički Dictionary, budući da je to preporučena kolekcija za novi C# kod.

Podaci za obuku ML.NET-a teku kroz tipizirane kolekcije i IDataView cjevovod, a ne kroz Hashtable. Međutim, mape ključ-vrijednost temeljene na hash-u i dalje podržavaju pretraživanje značajki, kodiranje vokabulara i predmemoriranje oko modela strojnog učenja.

Sažmite ovu objavu uz: