C#-Hashtable mit Beispielen

⚡ Intelligente Zusammenfassung

Eine Hashtabelle in C# ist eine Sammlung aus dem Namespace System.Collections, die Daten als Schlüssel-Wert-Paare speichert, wobei jeder eindeutige Schlüssel einem Wert zugeordnet ist und der Schlüssel ein schnelles Auffinden dieses gespeicherten Werts ermöglicht.

  • 📚 Schlüssel-Wert-Paare: Eine Hashtabelle speichert pro Element zwei Werte, einen Schlüssel und seinen Wert, anstatt des einzelnen Werts, der von einem Stack oder einer Array-Liste gespeichert wird.
  • Hinzufügen von Elementen: Die Add-Methode fügt einen Schlüssel und einen Wert zusammen ein, und jeder Schlüssel in der Hashtabelle muss eindeutig sein.
  • 👀 ContainsKey und ContainsValue: Diese Methoden geben true oder false zurück, sodass Sie prüfen können, ob ein Schlüssel oder ein Wert bereits existiert.
  • 🔁 Lesewerte: Mit der Keys-Eigenschaft einer ICollection oder einer DictionaryEntry-Schleife können Sie jeden gespeicherten Wert nacheinander lesen.
  • Methoden und Eigenschaften: Die Funktionen „Entfernen“, „Löschen“, „Zählen“, „Schlüssel“ und „Werte“ verwalten und überprüfen den Inhalt der Hashtabelle.
  • 🤖 KI-Unterstützung: GitHub Copilot generiert Hashtable-Code, während modernes C# und ML.NET das generische Dictionary für typsichere Schlüssel-Wert-Daten bevorzugen.

C#-Hashtabelle

Was ist Hashtable in C#?

Eine Hash-Tabelle ist eine spezielle Sammlung, die zum Speichern von Schlüsselwertelementen verwendet wird. Anstatt also nur einen Wert wie den Stapel, die Array-Liste und die Warteschlange zu speichern, speichert die Hash-Tabelle zwei Werte. Diese 2 Werte bilden ein Element der Hash-Tabelle.

Nachfolgend finden Sie einige Beispiele dafür, wie Werte einer Hash-Tabelle aussehen könnten.

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

Oben haben wir 3 Schlüsselwertpaare. Die Schlüssel jedes Elements sind 001, 002 bzw. 003. Die Werte jedes Schlüsselwertpaares sind „.Netz“, „C#“ bzw. „ASP.Net“.

Sehen wir uns die für die Hashtable-Sammlung verfügbaren Operationen genauer an.

Deklaration der Hashtabelle

Die Deklaration einer Hashtable ist unten dargestellt. Mit Hilfe des Hashtable-Datentyps wird eine Hashtable erstellt. Das Schlüsselwort „new“ wird verwendet, um ein Objekt einer Hashtable zu erstellen. Das Objekt wird dann der Variablen ht zugewiesen.

Hashtable ht = new Hashtable()

Elemente zur Hashtable hinzufügen

Die Add-Methode wird verwendet, um ein Element zum hinzuzufügen Warteschlange. Die allgemeine Syntax der Anweisung ist unten angegeben

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

Beispiel 1:

Denken Sie daran, dass jedes Element der Hash-Tabelle aus zwei Werten besteht, einer ist der Schlüssel und der andere ist der Wert.

Sehen wir uns nun an, wie dies auf Codeebene funktioniert. Der gesamte unten genannte Code wird in unsere Konsolenanwendung geschrieben.

Der Code wird in unsere Program.cs-Datei geschrieben. Im folgenden Programm schreiben wir den Code, um zu sehen, wie wir die oben genannten Methoden verwenden können.

In unserem Beispiel schauen wir uns zunächst an, wie wir eine Hashtabelle erstellen, Elemente zur Hashtabelle hinzufügen und diese entsprechend anzeigen können.

Hashtabelle 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 Erläuterung:-

  1. Zuerst deklarieren wir die Hashtable-Variable mithilfe des Hashtable-Datentyps und verwenden dazu das Schlüsselwort „New“. Der Name der definierten Variablen ist „ht“.
  2. Anschließend fügen wir mithilfe der Add-Methode Elemente zur Hash-Tabelle hinzu. Denken Sie daran, dass wir sowohl ein Schlüssel- als auch ein Wertelement hinzufügen müssen, wenn wir etwas zur Hashtabelle hinzufügen.
  3. Es gibt keine direkte Möglichkeit, die Elemente einer Hash-Tabelle anzuzeigen.
    • Um die Hashtabelle anzuzeigen, müssen wir zunächst die Liste der Schlüssel (001, 002 und 003) aus der Hashtabelle abrufen.
    • Dies erfolgt über die ICollection-Schnittstelle. Dies ist ein spezieller Datentyp, der zum Speichern der Schlüssel einer Hashtable-Sammlung verwendet werden kann. Anschließend weisen wir die Schlüssel der Hashtable-Sammlung der Variablen „keys“ zu.
  4. Als nächstes erhalten wir für jeden Schlüsselwert den zugehörigen Wert in der Hashtabelle, indem wir die Anweisung ht[k] verwenden.

Wenn der obige Code richtig eingegeben und das Programm ausgeführt wird, wird die folgende Ausgabe angezeigt.

Ausgang:

Hashtabelle in C#

Schauen wir uns einige weitere Methoden an, die für Hash-Tabellen verfügbar sind.

EnthältSchlüssel

Diese Methode wird verwendet, um zu sehen, ob ein Schlüssel in der Hashtable vorhanden ist. Nachfolgend finden Sie die allgemeine Syntax dieser Anweisung. Die Anweisung gibt „true“ zurück, wenn der Schlüssel existiert, andernfalls gibt sie den Wert „false“ zurück.

Hashtable.Containskey(key)

EnthältWert

Diese Methode wird verwendet, um zu sehen, ob ein Wert in der Hashtable vorhanden ist. Nachfolgend finden Sie die allgemeine Syntax dieser Anweisung. Die Anweisung gibt „true“ zurück, wenn der Wert existiert, andernfalls gibt sie den Wert „false“ zurück.

Hashtable.ContainsValue(value)

Beispiel 2:

Lassen Sie uns den Code in unserem ändern Konsolenanwendung um zu zeigen, wie wir die Methoden „Containskey“ und „ContainsValue“ verwenden können.

Hashtabelle 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 Erläuterung:-

  1. Zuerst verwenden wir die Methode „ContainsKey“, um zu prüfen, ob der Schlüssel in der Hashtabelle vorhanden ist. Diese Methode gibt true zurück, wenn der Schlüssel in der Hashtabelle vorhanden ist. Diese Methode sollte „true“ zurückgeben, da der Schlüssel in der Hashtabelle vorhanden ist.
  2. Anschließend verwenden wir die Methode „ContainsValue“, um zu prüfen, ob der Wert in der Hashtabelle vorhanden ist. Diese Methode gibt „true“ zurück, da der Wert in der Hashtabelle vorhanden ist.

Wenn der obige Code richtig eingegeben und das Programm ausgeführt wird, wird die folgende Ausgabe angezeigt.

Ausgang:

Hashtabelle in C#

Anhand der Ausgabe können Sie deutlich erkennen, dass sowohl der gesuchte Schlüssel als auch der gesuchte Wert in der Hash-Tabelle vorhanden sind.

Wie man eine Hashtabelle in C# durchläuft

Die obigen Beispiele lesen Werte über die Keys-Sammlung, aber eine Hashtabelle lässt sich eleganter durchlaufen. Eine foreach-Schleife über ein DictionaryEntry liefert Schlüssel und Wert jedes Elements in einem einzigen Durchlauf. Dies ist die gängigste Methode, eine Hashtabelle zu lesen.

Schritt 1) Erstelle eine Hashtabelle und füge ihr drei Schlüssel-Wert-Paare hinzu.

Schritt 2) Iteriere mit einer DictionaryEntry-Variablen über die Hashtabelle und lies anschließend die Key- und Value-Eigenschaften jedes Eintrags aus.

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 Erläuterung:-

  1. Es wird eine Hashtabelle namens ht erstellt, und mit der Add-Methode werden drei Schlüssel-Wert-Paare eingefügt.
  2. Die foreach-Schleife weist jedes Element einem DictionaryEntry zu, dessen Key- und Value-Eigenschaften die beiden Hälften des Paares offenlegen.

Wenn das Programm ausgeführt wird, gibt es jeden Schlüssel neben seinem Wert aus, zum Beispiel 101 – JavaDa eine Hashtabelle die Einfügereihenfolge nicht beibehält, können die Paare in einer anderen Reihenfolge erscheinen, als sie hinzugefügt wurden. Um nur die Schlüssel zu lesen, durchlaufen Sie die Schlüssel-Sammlung, und um nur die Werte zu lesen, durchlaufen Sie stattdessen die Werte-Sammlung.

C# Hashtabellenmethoden und -eigenschaften

Die Hashtable-Klasse stellt eine kleine Anzahl von Methoden und Eigenschaften bereit, die nahezu alle benötigten Aufgaben abdecken – vom Hinzufügen und Entfernen von Paaren bis hin zur Überprüfung der Zugehörigkeit und dem Zählen von Elementen. Die wichtigsten Methoden sind unten aufgeführt.

Member Typ Beschreibung
Add(key, value) Methodik Fügt ein neues Schlüssel-Wert-Paar ein; der Schlüssel muss eindeutig sein.
Entfernen (Schlüssel) Methodik Löscht das Element, das dem angegebenen Schlüssel entspricht.
Klar() Methodik Entfernt alle Schlüssel-Wert-Paare aus der Hashtabelle.
ContainsKey(key) Methodik Gibt „true“ zurück, wenn der angegebene Schlüssel vorhanden ist.
EnthältWert(Wert) Methodik Gibt „true“ zurück, wenn der angegebene Wert vorhanden ist.
Zu Zählen Eigenschaft Gibt die Anzahl der gespeicherten Schlüssel-Wert-Paare zurück.
Tasten Eigenschaft Gibt eine Sammlung aller Schlüssel zurück.
Werte Eigenschaft Gibt eine Sammlung aller Werte zurück.

Da jeder Schlüssel gehasht wird, können ContainsKey und der Indexer ein Element in nahezu konstanter Zeit finden, was eine Hashtabelle so nützlich für schnelle Suchvorgänge macht.

Unterschied zwischen Hashtabelle und Wörterbuch in C#

Eine Hashtabelle und ein Wörterbuch speichern beide Schlüssel-Wert-Paare und gehören beide zur größeren Familie der C#-Datentypen. produktauswahlDer entscheidende Unterschied liegt in der Typsicherheit, und dieser Unterschied bestimmt, welche Variante Sie in neuem Code verwenden sollten.

  • Typensicherheit: Eine Hashtabelle speichert jeden Schlüssel und Wert als Objekt, während ein Wörterbuch ist generisch, daher überprüft der Compiler die verwendeten Typen.
  • Namespace: Hashtable befindet sich in System.Collections, Dictionary hingegen in System.Collections.Generic.
  • Boxing: Eine Hashtabelle speichert Werttypen wie int in einer Box, während ein generisches Wörterbuch sie direkt speichert und so diesen Aufwand vermeidet.
  • Eigenschaften: Ein Wörterbuch ist in der Regel schneller, da beim Lesen eines Wertes keine Rückumwandlung vom Objekt erforderlich ist.
  • Gewindesicherheit: Hashtable bietet die SyncEine chronisierte Wrapper-Funktion für einen Schreiber mit vielen Lesern, während paralleler Code üblicherweise ConcurrentDictionary verwendet.

Für jedes neue Projekt ist das generische Dictionary die empfohlene Wahl, die nicht-generische Hashtable findet sich hauptsächlich in älterem Code.

Häufig gestellte Fragen

Die Remove-Methode löscht das Element mit dem angegebenen Schlüssel und verringert die Anzahl um eins. Existiert der Schlüssel nicht, passiert nichts. Rufen Sie daher zuerst ContainsKey auf, wenn Sie sichergehen müssen, dass der Schlüssel vorhanden ist.

Nein. Jeder Schlüssel in einer Hashtabelle muss eindeutig sein. Der Aufruf von `Add` mit einem bereits existierenden Schlüssel löst eine `ArgumentException` aus. Sie können jedoch denselben Wert unter mehreren verschiedenen Schlüsseln speichern, ohne dass ein Fehler auftritt.

Eine Hashtabelle unterstützt einen Schreiber mit vielen Lesern sicher. Für mehrere Schreibvorgänge sollte diese Hashtabelle verwendet werden.SyncAlternativ können Sie auf chronized zurückgreifen oder ConcurrentDictionary aus System.Collections.Concurrent bevorzugen, das gleichzeitige Lese- und Schreibvorgänge ohne externe Sperren ermöglicht.

Das Auffinden eines Wertes anhand eines Schlüssels erfolgt im Durchschnitt in nahezu konstanter Zeit O(1), da der Schlüssel gehasht wird, um seinen Bucket zu finden. Starke Hash-Kollisionen können den Vorgang zwar verlangsamen, sind aber bei gut verteilten Schlüsseln selten.

Ein Wert darf null sein, ein Schlüssel jedoch nicht. Die Übergabe eines null-Schlüssels an die Add-Methode oder den Indexer löst eine ArgumentNullException aus. Jeder Schlüssel muss zudem eindeutig sein und darf sich während der Speicherung nicht ändern.

Eine Hashtabelle speichert keine Reihenfolge und kann daher nicht direkt sortiert werden. Kopieren Sie ihre Schlüssel in eine Liste oder eine ArrayList, sortieren Sie diese Liste und lesen Sie dann die Werte anhand des Schlüssels. Eine SortedList hingegen speichert die Reihenfolge ihrer Einträge automatisch.

Ja. GitHub Copilot generiert Hashtable-Deklarationen, Add-Aufrufe und DictionaryEntry-Schleifen anhand eines kurzen Kommentars oder Methodennamens. Häufig wird dabei das generische Dictionary vorgeschlagen, da dies die empfohlene Datenstruktur für neuen C#-Code ist.

Die Trainingsdaten von ML.NET fließen über typisierte Sammlungen und die IDataView-Pipeline anstatt über eine Hashtabelle. Hashbasierte Schlüssel-Wert-Zuordnungen unterstützen jedoch weiterhin Merkmalsabfragen, Vokabularkodierung und Caching um ein Machine-Learning-Modell herum.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: