C# Hashtable cu exemple

โšก Rezumat inteligent

Un tabel hash รฎn C# este o colecศ›ie din spaศ›iul de nume System.Collections care stocheazฤƒ date ca perechi cheie-valoare, unde fiecare cheie unicฤƒ este asociatฤƒ cu o valoare, iar cheia oferฤƒ o cฤƒutare rapidฤƒ a acelei valori stocate.

  • ๐Ÿ“š Perechi cheie-valoare: Un tabel hash stocheazฤƒ douฤƒ valori per element, o cheie ศ™i valoarea sa, รฎn loc de valoarea unicฤƒ deศ›inutฤƒ de o stivฤƒ sau o listฤƒ de matrice.
  • โž• Adฤƒugarea de elemente: Metoda Add insereazฤƒ o cheie ศ™i o valoare รฎmpreunฤƒ, iar fiecare cheie din tabelul Hash trebuie sฤƒ fie unicฤƒ.
  • ๐Ÿ‘€ ContainsKey ศ™i ContainsValue: Aceste metode returneazฤƒ true sau false, astfel รฎncรขt sฤƒ puteศ›i testa dacฤƒ o cheie sau o valoare existฤƒ deja.
  • ๐Ÿ” Valori de citire: Proprietatea Keys cu o ICollection sau o buclฤƒ DictionaryEntry vฤƒ permite sฤƒ citiศ›i pe rรขnd fiecare valoare stocatฤƒ.
  • ๐Ÿ› ๏ธ Metode ศ™i proprietฤƒศ›i: Funcศ›iile Remove, Clear, Count, Keys ศ™i Values โ€‹โ€‹gestioneazฤƒ ศ™i inspecteazฤƒ conศ›inutul tabelului hash.
  • ๐Ÿค– Asistenศ›ฤƒ AI: GitHub Copilot foloseศ™te schele de cod Hashtable, รฎn timp ce C# ศ™i ML.NET moderne preferฤƒ Dicศ›ionarul generic pentru date cheie-valoare sigure pentru tipuri.

C# Hashtable

Ce este Hashtable รฎn C#?

Un tabel hash este o colecศ›ie specialฤƒ care este utilizatฤƒ pentru a stoca elemente cheie-valoare. Deci, รฎn loc sฤƒ stocheze o singurฤƒ valoare, cum ar fi stiva, lista de matrice ศ™i coada, tabelul hash stocheazฤƒ 2 valori. Aceste 2 valori formeazฤƒ un element al tabelului hash.

Mai jos sunt cรขteva exemple despre cum ar putea arฤƒta valorile unui tabel hash.

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

Mai sus avem 3 perechi valori cheie. Cheile fiecฤƒrui element sunt 001, 002 ศ™i, respectiv, 003. Valorile fiecฤƒrei perechi valori cheie sunt โ€ž.Netโ€ž, โ€žC#โ€ ศ™i, respectiv, โ€žASP.Netโ€.

Sฤƒ ne uitฤƒm la operaศ›iunile disponibile pentru colecศ›ia Hashtable mai detaliat.

Declaraศ›ia Hashtable

Declaraศ›ia unui Hashtable este prezentatฤƒ mai jos. Un Hashtable este creat cu ajutorul Hashtable Datatype. Cuvรขntul cheie โ€žnouโ€ este folosit pentru a crea un obiect al unui Hashtable. Obiectul este apoi atribuit variabilei ht.

Hashtable ht = new Hashtable()

Adฤƒugarea de elemente la Hashtable

Metoda Add este folositฤƒ pentru a adฤƒuga un element la coadฤƒ. Sintaxa generalฤƒ a enunศ›ului este datฤƒ mai jos

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

Exemplu 1:

Reศ›ineศ›i cฤƒ fiecare element al tabelului hash cuprinde 2 valori, una este cheia, iar cealaltฤƒ este valoarea.

Acum, sฤƒ vedem asta funcศ›ionรขnd la nivel de cod. Tot codul menศ›ionat mai jos va fi scris รฎn aplicaศ›ia noastrฤƒ Console.

Codul va fi scris รฎn fiศ™ierul nostru Program.cs. รŽn programul de mai jos, vom scrie codul pentru a vedea cum putem folosi metodele menศ›ionate mai sus.

Deocamdatฤƒ, รฎn exemplul nostru, ne vom uita doar la modul รฎn care putem crea un hashtable , adฤƒugam elemente la hashtable ศ™i le vom afiศ™a รฎn consecinศ›ฤƒ.

Hashtable รฎn 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 Explicaลฃie:-

  1. Mai รฎntรขi, declarฤƒm variabila hashtable folosind tipul de date Hashtable folosind cuvรขntul cheie โ€žNouโ€. Numele variabilei definite este โ€žhtโ€.
  2. Apoi adฤƒugฤƒm elemente la tabelul hash folosind metoda Add. Amintiศ›i-vฤƒ cฤƒ trebuie sฤƒ adฤƒugฤƒm atรขt un element cheie, cรขt ศ™i un element de valoare atunci cรขnd adฤƒugฤƒm ceva la tabelul hash.
  3. Nu existฤƒ o modalitate directฤƒ de a afiศ™a elementele unui tabel hash.
    • Pentru a afiศ™a tabelul hash, mai รฎntรขi trebuie sฤƒ obศ›inem lista de chei (001, 002 ศ™i 003) din tabelul hash.
    • Acest lucru se face prin interfaศ›a ICollection. Acesta este un tip de date special care poate fi folosit pentru a stoca cheile unei colecศ›ii hashtable. Apoi atribuim cheile colecศ›iei hashtable variabilei โ€žcheiโ€.
  4. รŽn continuare, pentru fiecare valoare cheie, obศ›inem valoarea asociatฤƒ รฎn tabelul hash utilizรขnd instrucศ›iunea ht[k].

Dacฤƒ codul de mai sus este introdus corect ศ™i programul este rulat, va fi afiศ™atฤƒ urmฤƒtoarea ieศ™ire.

ieศ™ire:

Hashtable รฎn C#

Sฤƒ ne uitฤƒm la cรขteva metode disponibile pentru tabelele hash.

Conศ›ine cheia

Aceastฤƒ metodฤƒ este folositฤƒ pentru a vedea dacฤƒ o cheie este prezentฤƒ รฎn Hashtable. Mai jos este sintaxa generalฤƒ a acestei declaraศ›ii. Declaraศ›ia va returna true dacฤƒ cheia existฤƒ, altfel va returna valoarea false.

Hashtable.Containskey(key)

Conศ›ineValoare

Aceastฤƒ metodฤƒ este folositฤƒ pentru a vedea dacฤƒ o valoare este prezentฤƒ รฎn Hashtable. Mai jos este sintaxa generalฤƒ a acestei declaraศ›ii. Declaraศ›ia va returna true dacฤƒ Value existฤƒ, altfel va returna valoarea false.

Hashtable.ContainsValue(value)

Exemplu 2:

Sฤƒ modificฤƒm codul din nostru Aplicaศ›ie de consolฤƒ pentru a arฤƒta cum putem folosi metoda โ€žContainskeyโ€ ศ™i โ€žContainsValueโ€.

Hashtable รฎn 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 Explicaลฃie:-

  1. รŽn primul rรขnd, folosim metoda ContainsKey pentru a vedea dacฤƒ cheia este prezentฤƒ รฎn hashtable. Aceastฤƒ metodฤƒ va returna true dacฤƒ cheia este prezentฤƒ รฎn tabelul hash. Aceastฤƒ metodฤƒ ar trebui sฤƒ returneze true, deoarece cheia existฤƒ รฎn tabelul hash.
  2. Apoi folosim metoda ContainsValue pentru a vedea dacฤƒ valoarea este prezentฤƒ รฎn tabelul hash. Aceastฤƒ metodฤƒ va returna โ€žadevฤƒratโ€, deoarece Valoarea existฤƒ รฎn tabelul hash.

Dacฤƒ codul de mai sus este introdus corect ศ™i programul este rulat, va fi afiศ™atฤƒ urmฤƒtoarea ieศ™ire.

ieศ™ire:

Hashtable รฎn C#

Din rezultat, puteศ›i vedea clar cฤƒ atรขt cheia, cรขt ศ™i valoarea cฤƒutate sunt prezente รฎn tabelul hash.

Cum se parcurge o buclฤƒ printr-un tabel hash C#

Exemplele de mai sus citesc valori prin colecศ›ia Keys, dar un Hashtable poate fi parcurs รฎntr-un mod mai curat. O buclฤƒ foreach peste un DictionaryEntry vฤƒ oferฤƒ cheia ศ™i valoarea fiecฤƒrui element รฎmpreunฤƒ รฎntr-o singurฤƒ trecere, aceasta fiind cea mai comunฤƒ modalitate de a citi un Hashtable.

Pas 1) Creaศ›i un tabel hash ศ™i adฤƒugaศ›i-i trei perechi cheie-valoare.

Pas 2) Parcurge Hashtable-ul cu o variabilฤƒ DictionaryEntry, apoi citeศ™te proprietฤƒศ›ile Key ศ™i Value ale fiecฤƒrei intrฤƒri.

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 Explicaลฃie:-

  1. Se creeazฤƒ un tabel hash numit ht ศ™i se insereazฤƒ trei perechi cheie-valoare cu metoda Add.
  2. Bucla foreach atribuie fiecฤƒrui element unei entitฤƒศ›i DictionaryEntry, ale cฤƒrei proprietฤƒศ›i Key ศ™i Value expun cele douฤƒ jumฤƒtฤƒศ›i ale perechii.

Cรขnd programul ruleazฤƒ, acesta afiศ™eazฤƒ fiecare cheie lรขngฤƒ valoarea sa, cum ar fi 101 โ€“ JavaDeoarece un tabel hash nu pฤƒstreazฤƒ ordinea de inserare, perechile pot apฤƒrea รฎntr-o secvenศ›ฤƒ diferitฤƒ de cea รฎn care au fost adฤƒugate. Pentru a citi doar cheile, parcurgeศ›i colecศ›ia Keys, iar pentru a citi doar valorile, parcurgeศ›i รฎn schimb colecศ›ia Values.

Metode ศ™i proprietฤƒศ›i hashtable C#

Clasa Hashtable expune un set mic de metode ศ™i proprietฤƒศ›i care acoperฤƒ aproape fiecare sarcinฤƒ de care veศ›i avea nevoie, de la adฤƒugarea ศ™i eliminarea perechilor pรขnฤƒ la verificarea apartenenศ›ei ศ™i numฤƒrarea elementelor. Cei mai utili membri sunt enumeraศ›i mai jos.

Membru Tip Descriere
Adฤƒugaศ›i(cheie, valoare) Metodฤƒ Introduce o nouฤƒ pereche cheie-valoare; cheia trebuie sฤƒ fie unicฤƒ.
Eliminare (cheie) Metodฤƒ ศ˜terge elementul care corespunde cheii specificate.
Clar() Metodฤƒ Eliminฤƒ fiecare pereche cheie-valoare din tabelul hash.
Conศ›ineCheia(cheie) Metodฤƒ Returneazฤƒ โ€žtrueโ€ cรขnd cheia datฤƒ este prezentฤƒ.
Conศ›ineValoare(valoare) Metodฤƒ Returneazฤƒ โ€žtrueโ€ cรขnd valoarea datฤƒ este prezentฤƒ.
Conta Proprietatea Obศ›ine numฤƒrul de perechi cheie-valoare stocate.
Taste Proprietatea Returneazฤƒ o colecศ›ie a tuturor cheilor.
Valori Proprietatea Returneazฤƒ o colecศ›ie a tuturor valorilor.

Deoarece fiecare cheie este codificatฤƒ prin hashing, ContainsKey ศ™i indexorul localizeazฤƒ un element รฎntr-un timp aproape constant, ceea ce face ca un Hashtable sฤƒ fie atรขt de util pentru cฤƒutฤƒri rapide.

Diferenศ›a dintre hashtable ศ™i dicศ›ionar รฎn C#

Un tabel hash ศ™i un dicศ›ionar stocheazฤƒ ambele perechi cheie-valoare ศ™i ambele aparศ›in familiei mai largi de C# colecศ›iiDiferenศ›a importantฤƒ este siguranศ›a tipului, iar aceastฤƒ diferenศ›ฤƒ decide pe care ar trebui sฤƒ รฎl alegeศ›i รฎn codul nou.

  • Tip de siguranศ›ฤƒ: Un Hashtable stocheazฤƒ fiecare cheie ศ™i valoare ca obiect, รฎn timp ce Dictionary este generic, deci compilatorul verificฤƒ tipurile pe care le utilizaศ›i.
  • Spaศ›iu de nume: Hashtable se aflฤƒ รฎn System.Collections, รฎn timp ce Dictionary se aflฤƒ รฎn System.Collections.Generic.
  • BoxING: O tabelฤƒ hash รฎncadreazฤƒ tipuri de valori precum int, dar un dicศ›ionar generic le stocheazฤƒ direct ศ™i evitฤƒ acest cost.
  • Performanศ›ฤƒ: Dicศ›ionarul este de obicei mai rapid deoarece nu necesitฤƒ o conversie inversฤƒ de la obiect atunci cรขnd citeศ™ti o valoare.
  • Siguranศ›a filetului: Hashtable oferฤƒ Syncรฎncapsulare sincronizatฤƒ pentru un scriitor cu mulศ›i cititori, รฎn timp ce codul concurent alege de obicei ConcurrentDictionary.

Pentru orice proiect nou, Dicศ›ionarul generic este alegerea recomandatฤƒ, iar Hashtable-ul non-generic apare รฎn principal รฎn codul mai vechi.

รŽntrebฤƒri frecvente

Metoda Remove ศ™terge elementul cu o cheie datฤƒ ศ™i reduce Count cu unu. Dacฤƒ cheia nu existฤƒ, nu se รฎntรขmplฤƒ nimic, aศ™a cฤƒ apelaศ›i mai รฎntรขi ContainsKey atunci cรขnd trebuie sฤƒ vฤƒ asiguraศ›i cฤƒ cheia este prezentฤƒ.

Nu. Fiecare cheie dintr-un Hashtable trebuie sฤƒ fie unicฤƒ. Apelarea funcศ›iei Add cu o cheie care existฤƒ deja genereazฤƒ o ArgumentException. Cu toate acestea, puteศ›i stoca aceeaศ™i valoare sub mai multe chei diferite fฤƒrฤƒ nicio eroare.

Un Hashtable permite accesul รฎn siguranศ›ฤƒ a unui scriitor cu mai mulศ›i cititori. Pentru mai multe fire de scriere, รฎncapsulaศ›i-le folosind Hashtable.Syncchronized sau preferaศ›i ConcurrentDictionary din System.Collections.Concurrent, care gestioneazฤƒ citirile ศ™i scrierile concurente fฤƒrฤƒ blocฤƒri externe.

Cฤƒutarea unei valori dupฤƒ cheie se executฤƒ รฎn medie รฎntr-un timp O(1) aproape constant, deoarece cheia este haศ™atฤƒ pentru a-ศ™i gฤƒsi compartimentul. Coliziunile hash puternice o pot รฎncetini, dar acest lucru este rar รฎn cazul cheilor bine distribuite.

O valoare poate fi nulฤƒ, dar o cheie nu. Transmiterea unei chei nule cฤƒtre Add sau indexator genereazฤƒ o excepศ›ie ArgumentNullException. Fiecare cheie trebuie sฤƒ fie unicฤƒ ศ™i nu ar trebui sฤƒ se modifice รฎn timp ce este stocatฤƒ.

Un tabel hash nu pฤƒstreazฤƒ o ordine, deci nu poate fi sortat la locul lui. Copiaศ›i cheile sale รฎntr-o listฤƒ sau รฎntr-un ArrayList, sortaศ›i acea listฤƒ, apoi citiศ›i valorile dupฤƒ cheie. Un SortedList รฎศ™i pฤƒstreazฤƒ intrฤƒrile ordonate automat.

Da. GitHub Copilot scrie declaraศ›ii Hashtable, apeluri Add ศ™i bucle DictionaryEntry dintr-un comentariu scurt sau un nume de metodฤƒ. Adesea sugereazฤƒ รฎn schimb Dicศ›ionarul generic, deoarece aceasta este colecศ›ia recomandatฤƒ pentru codul C# nou.

Datele de antrenament ML.NET circulฤƒ prin colecศ›ii tipizate ศ™i canalul IDataView, mai degrabฤƒ decรขt printr-un Hashtable. Cu toate acestea, hฤƒrศ›ile cheie-valoare bazate pe hash รฎncฤƒ acceptฤƒ cฤƒutฤƒri de caracteristici, codificare vocabular ศ™i memorare รฎn cache รฎn jurul unui model de รฎnvฤƒศ›are automatฤƒ.

Rezumaศ›i aceastฤƒ postare cu: