C# Hashtabel met voorbeelden

⚡ Slimme samenvatting

Een hashtable in C# is een verzameling uit de namespace System.Collections die gegevens opslaat als sleutel-waardeparen, waarbij elke unieke sleutel is gekoppeld aan een waarde en de sleutel een snelle opzoeking van die opgeslagen waarde mogelijk maakt.

  • 📚 Sleutel-waardeparen: Een hashtabel slaat twee waarden per element op: een sleutel en de bijbehorende waarde, in plaats van de enkele waarde die een stack of arraylijst bevat.
  • ➕ Elementen toevoegen: De Add-methode voegt een sleutel en een waarde samen in, en elke sleutel in de Hashtable moet uniek zijn.
  • 👀 BevatSleutel en BevatWaarde: Deze methoden retourneren true of false, zodat je kunt testen of een sleutel of waarde al bestaat.
  • 🔁 Leeswaarden: Met de eigenschap Keys in combinatie met een ICollection of een DictionaryEntry-lus kunt u elke opgeslagen waarde achtereenvolgens uitlezen.
  • ️ Methoden en eigenschappen: Met Remove, Clear, Count, Keys en Values ​​kunt u de inhoud van de hashtabel beheren en inspecteren.
  • 🤖 AI-assistentie: GitHub Copilot genereert code met behulp van hashtabellen, terwijl moderne C# en ML.NET de voorkeur geven aan het generieke woordenboek voor typeveilige sleutel-waardeparen.

C# Hashtabel

Wat is hashtabel in C#?

Een hashtabel is een speciale verzameling die wordt gebruikt om sleutelwaarde-items op te slaan. Dus in plaats van slechts één waarde op te slaan, zoals de stapel, de arraylijst en de wachtrij, slaat de hashtabel twee waarden op. Deze 2 waarden vormen een onderdeel van de hashtabel.

Hieronder vindt u enkele voorbeelden van hoe de waarden van een hashtabel eruit kunnen zien.

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

Hierboven hebben we 3 sleutelwaardeparen. De toetsen van elk element zijn respectievelijk 001, 002 en 003. De waarden van elk sleutelwaardepaar zijn “. Net“, “C#” en “ASP.Net” respectievelijk.

Laten we de bewerkingen die beschikbaar zijn voor de Hashtable-verzameling eens nader bekijken.

Verklaring van de hashtabel

De declaratie van een hashtabel wordt hieronder weergegeven. Met behulp van het Hashtable Datatype wordt een Hashtabel gemaakt. Het trefwoord “nieuw” wordt gebruikt om een ​​object van een hashtabel te maken. Het object wordt vervolgens toegewezen aan de variabele ht.

Hashtable ht = new Hashtable()

Elementen toevoegen aan de hashtabel

De Add-methode wordt gebruikt om een ​​element toe te voegen aan de queue. De algemene syntaxis van de verklaring wordt hieronder gegeven

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

Voorbeeld 1:

Onthoud dat elk element van de hashtabel uit twee waarden bestaat: de ene is de sleutel en de andere is de waarde.

Laten we dit nu op codeniveau zien werken. Alle onderstaande code wordt naar onze Console-applicatie geschreven.

De code wordt naar ons Program.cs-bestand geschreven. In het onderstaande programma zullen we de code schrijven om te zien hoe we de bovengenoemde methoden kunnen gebruiken.

Voor nu zullen we in ons voorbeeld alleen kijken hoe we een hashtabel kunnen maken, elementen aan de hashtabel kunnen toevoegen en deze dienovereenkomstig kunnen weergeven.

Hashtabel in 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 Uitleg:-

  1. Eerst declareren we de hashtabelvariabele met behulp van het gegevenstype Hashtable door het trefwoord 'Nieuw' te gebruiken. De naam van de variabele die wordt gedefinieerd is 'ht'.
  2. Vervolgens voegen we elementen toe aan de hashtabel met behulp van de Add-methode. Houd er rekening mee dat we zowel een sleutel- als een waarde-element moeten toevoegen wanneer we iets aan de hashtabel toevoegen.
  3. Er is geen directe manier om de elementen van een hashtabel weer te geven.
    • Om de hashtabel weer te geven, moeten we eerst de lijst met sleutels (001, 002 en 003) uit de hashtabel halen.
    • Dit gebeurt via de ICollection-interface. Dit is een speciaal gegevenstype dat kan worden gebruikt om de sleutels van hashtabelcollecties op te slaan. Vervolgens wijzen we de sleutels van de hashtabelverzameling toe aan de variabele 'sleutels'.
  4. Vervolgens krijgen we voor elke sleutelwaarde de bijbehorende waarde in de hashtabel door de instructie ht[k] te gebruiken.

Als de bovenstaande code correct is ingevoerd en het programma wordt uitgevoerd, wordt de volgende uitvoer weergegeven.

Output:

Hashtabel in C#

Laten we eens kijken naar enkele andere methoden die beschikbaar zijn voor hashtabellen.

Bevat sleutel

Deze methode wordt gebruikt om te zien of een sleutel aanwezig is in de hashtabel. Hieronder vindt u de algemene syntaxis van deze verklaring. De instructie retourneert true als de sleutel bestaat, anders wordt de waarde false geretourneerd.

Hashtable.Containskey(key)

Bevatwaarde

Deze methode wordt gebruikt om te zien of een waarde aanwezig is in de hashtabel. Hieronder vindt u de algemene syntaxis van deze verklaring. De instructie retourneert true als de waarde bestaat, anders wordt de waarde false geretourneerd.

Hashtable.ContainsValue(value)

Voorbeeld 2:

Laten we de code in ons Console applicatie om te laten zien hoe we de methoden “Containskey” en “ContainsValue” kunnen gebruiken.

Hashtabel in 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 Uitleg:-

  1. Eerst gebruiken we de methode ContainsKey om te zien of de sleutel aanwezig is in de hashtabel. Deze methode retourneert true als de sleutel aanwezig is in de hashtabel. Deze methode zou true moeten retourneren, omdat de sleutel wel in de hashtabel voorkomt.
  2. Vervolgens gebruiken we de methode BevatValue om te zien of de waarde aanwezig is in de hashtabel. Deze methode retourneert 'true' omdat de waarde wel in de hashtabel voorkomt.

Als de bovenstaande code correct is ingevoerd en het programma wordt uitgevoerd, wordt de volgende uitvoer weergegeven.

Output:

Hashtabel in C#

Uit de uitvoer kunt u duidelijk zien dat zowel de sleutel als de waarde waarnaar wordt gezocht, aanwezig zijn in de hashtabel.

Hoe door een C#-hashtabel te itereren

De bovenstaande voorbeelden lezen waarden uit de Keys-verzameling, maar een Hashtable kan op een elegantere manier worden doorlopen. Een foreach-lus over een DictionaryEntry geeft je in één keer de sleutel en de waarde van elk element, wat de meest gebruikelijke manier is om een ​​Hashtable te lezen.

Stap 1) Maak een hashtabel aan en voeg er drie sleutel-waardeparen aan toe.

Stap 2) Doorloop de hashtabel met een variabele genaamd DictionaryEntry en lees vervolgens de eigenschappen Key en Value van elk item.

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 Uitleg:-

  1. Er wordt een hashtabel met de naam ht aangemaakt en er worden drie sleutel-waardeparen ingevoegd met de Add-methode.
  2. De foreach-lus wijst elk element toe aan een DictionaryEntry, waarvan de eigenschappen Key en Value de twee helften van het paar weergeven.

Wanneer het programma wordt uitgevoerd, print het elke sleutel naast de bijbehorende waarde, bijvoorbeeld 101 – JavaOmdat een hashtabel de invoegvolgorde niet bewaart, kunnen de paren in een andere volgorde verschijnen dan waarin ze zijn toegevoegd. Om alleen de sleutels te lezen, doorloop je de Keys-verzameling, en om alleen de waarden te lezen, doorloop je de Values-verzameling.

Methoden en eigenschappen van hashtables in C#

De Hashtable-klasse biedt een kleine set methoden en eigenschappen die vrijwel alle taken dekken die u nodig hebt, van het toevoegen en verwijderen van paren tot het controleren van lidmaatschap en het tellen van elementen. De meest nuttige leden worden hieronder vermeld.

Lid Type Beschrijving
Voeg(sleutel, waarde) toe Methode Voegt een nieuw sleutel-waardepaar in; de sleutel moet uniek zijn.
Verwijder(sleutel) Methode Verwijdert het element dat overeenkomt met de opgegeven sleutel.
Duidelijk() Methode Verwijdert alle sleutel-waardeparen uit de hashtabel.
BevatSleutel(sleutel) Methode Retourneert true wanneer de opgegeven sleutel aanwezig is.
BevatWaarde(waarde) Methode Retourneert true wanneer de opgegeven waarde aanwezig is.
Tellen Eigendom Geeft het aantal opgeslagen sleutel-waardeparen weer.
Keys Eigendom Geeft een verzameling van alle sleutels terug.
Waarden Eigendom Retourneert een verzameling van alle waarden.

Doordat elke sleutel gehasht is, vinden ContainsKey en de indexeerder een element in vrijwel constante tijd, wat een hashtabel zo nuttig maakt voor snelle zoekopdrachten.

Verschil tussen een hashtable en een dictionary in C#

Zowel een hashtabel als een woordenboek slaan sleutel-waardeparen op en behoren beide tot de bredere familie van C#-typen. collectiesHet belangrijkste verschil is de typeveiligheid, en dat verschil bepaalt welke je in nieuwe code moet gebruiken.

  • Type veiligheid: Een hashtabel slaat elke sleutel en waarde op als een object, terwijl een woordenboek is generiek, dus de compiler controleert de typen die je gebruikt.
  • namespace: Hashtables bevinden zich in System.Collections, terwijl Dictionary's zich in System.Collections.Generic bevinden.
  • Boxing: Een hashtabel slaat waardetypen zoals int op, maar een generieke dictionary slaat ze direct op en vermijdt die kosten.
  • prestaties: Een dictionary is meestal sneller omdat er geen typeconversie van een object nodig is wanneer je een waarde leest.
  • Draadveiligheid: Hashtable biedt de SyncEen gestandaardiseerde wrapper voor één schrijver met veel lezers, terwijl gelijktijdige code meestal kiest voor ConcurrentDictionary.

Voor elk nieuw project is het generieke woordenboek de aanbevolen keuze, terwijl de niet-generieke hashtabel voornamelijk in oudere code voorkomt.

Veelgestelde vragen

De Remove-methode verwijdert het element met een gegeven sleutel en verlaagt Count met één. Als de sleutel niet bestaat, gebeurt er niets. Roep daarom eerst ContainsKey aan als je zeker moet weten dat de sleutel aanwezig is.

Nee. Elke sleutel in een hashtabel moet uniek zijn. Het aanroepen van de Add-methode met een sleutel die al bestaat, resulteert in een ArgumentException. Je kunt echter dezelfde waarde onder meerdere verschillende sleutels opslaan zonder dat er een fout optreedt.

Een hashtabel ondersteunt één schrijver met meerdere lezers op een veilige manier. Voor meerdere schrijfprocessen kunt u een hashtabel gebruiken.SyncGebruik liever ConcurrentDictionary van System.Collections.Concurrent, die gelijktijdige lees- en schrijfbewerkingen afhandelt zonder externe vergrendelingen.

Het opzoeken van een waarde aan de hand van een sleutel duurt gemiddeld vrijwel constant O(1), omdat de sleutel wordt gehasht om de bijbehorende bucket te vinden. Zware hashbotsingen kunnen het proces vertragen, maar dat komt zelden voor bij goed verdeelde sleutels.

Een waarde mag null zijn, maar een sleutel niet. Het doorgeven van een null-sleutel aan Add of de indexeerder resulteert in een ArgumentNullException. Elke sleutel moet bovendien uniek zijn en mag niet veranderen zolang deze is opgeslagen.

Een hashtabel heeft geen vaste volgorde en kan dus niet ter plekke gesorteerd worden. Kopieer de sleutels naar een lijst of een ArrayList, sorteer die lijst en lees vervolgens de waarden op basis van de sleutel. Een SortedList houdt de items automatisch in de juiste volgorde.

Ja. GitHub Copilot genereert Hashtable-declaraties, Add-aanroepen en DictionaryEntry-loops op basis van een korte opmerking of methodenaam. Het stelt vaak de generieke Dictionary voor, omdat dat de aanbevolen collectie is voor nieuwe C#-code.

De trainingsgegevens van ML.NET worden verwerkt via getypte collecties en de IDataView-pipeline in plaats van een hashtabel. Hash-gebaseerde sleutel-waardeparen bieden echter nog steeds ondersteuning voor het opzoeken van kenmerken, het coderen van vocabulaire en het cachen van gegevens rondom een ​​machine learning-model.

Vat dit bericht samen met: