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: