Dictionary vs Hashtable in C#

Haider Ali 12 Oktober 2023
  1. Dictionary in C#
  2. Hashtable in C#
  3. Dictionary vs. Hashtable in C#
Dictionary vs Hashtable in C#

In diesem Leitfaden werden die Unterschiede zwischen Dictionary und Hashtable in C# erläutert.

Um zu verstehen, welche dieser Sammlungen besser und bevorzugt ist, müssen wir ihre Grundlagen verstehen. Gehen wir also die Syntax, Merkmale, Funktionalitäten und Methoden durch, die mit diesen beiden Sammlungen verbunden sind.

Welche sollten Sie bei der Arbeit an C# bevorzugen? Welches ist besser?

All diese Fragen werden im Folgenden beantwortet. Tauchen wir ein!

Dictionary in C#

Das Dictionary ist eine generische Sammlung. Es speichert Daten in Schlüssel-Wert-Paaren, und diese Sammlung hat keine bestimmte Reihenfolge.

Die Syntax des Dictionary ist wie folgt:

Dictionary<TKey, TValue>

Wir übergeben die Datenwerte zusammen mit ihren Schlüsseln. Lassen Sie uns die Eigenschaften des Dictionary durchgehen.

Eigenschaften des Dictionarys in C#

  1. Es speichert Schlüssel-Wert-Paare.
  2. Sein Namespace ist System.Collections.Generic.
  3. Die Schlüssel im Dictionary dürfen nicht null sein und sollten eindeutig sein.
  4. Werte können jedoch null sein und dupliziert werden.
  5. Wir können auf den Datenwert über den entsprechenden Schlüssel zugreifen, z. B. myDictionary[key].
  6. Alle Elemente werden als KeyValuePair<TKey, TValue> betrachtet.

Erstellen Sie ein Dictionary in C#

Sie können ein Dictionary in C# erstellen, indem Sie die Art der Werte und die entsprechenden Schlüssel übergeben, die es speichern kann. Sehen Sie sich den folgenden Code an, um zu sehen, wie wir ein Dictionary erstellen.

IDictionary<int, string> rollno_names = new Dictionary<int, string>();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (KeyValuePair<int, string> i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a dictionary using collection-initializer syntax
var countries = new Dictionary<string, string>() {
  { "UK", "United Kingdom" }, { "USA", "United States of America" }, { "PK", "Pakistan" }
};

foreach (var j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

Im obigen Code ist rollno_names ein Dictionary mit int als Schlüsseldatentyp und string als Wertdatentyp wie folgt:

Dictionary<int, string>

Dieses spezielle Dictionary kann int-Schlüssel und Zeichenfolgenwerte speichern. Das zweite Dictionary enthält Länder, die vom Sammlungsinitialisierer erstellt wurden.

Sowohl seine Schlüssel als auch seine Werte sind String-Datentypen. Wenn Sie versuchen, den Schlüsselwert zu duplizieren und ihn auf Null zu setzen, erhalten Sie eine Laufzeitausnahme.

Greifen Sie in C# auf ein Dictionaryelement zu

Auf ein Dictionary-Element können Sie mit Hilfe seines Indexers zugreifen. Sie müssen jeden Schlüssel angeben, um auf den entsprechenden Wert zuzugreifen.

ElementAt() ist ein weiterer Ansatz, um das Schlüssel-Wert-Paar zu erhalten. Sehen Sie sich den folgenden Code an.

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

Console.WriteLine(countries["UK"]);   // prints value of UK key
Console.WriteLine(countries["USA"]);  // prints value of USA key
// Console.WriteLine(countries["France"]); // runtime exception: key does not exist

// use ContainsKey() to check for the unknown key
if (countries.ContainsKey("France")) {
  Console.WriteLine(countries["France"]);
}

// use TryGetValue() to get a value of the unknown key
string result;

if (countries.TryGetValue("France", out result)) {
  Console.WriteLine(result);
}

// use ElementAt() to retrieve the key-value pair using the index
for (int i = 0; i < countries.Count; i++) {
  Console.WriteLine("Key: {0}, Value: {1}", countries.ElementAt(i).Key,
                    countries.ElementAt(i).Value);
}

Im obigen Code sehen Sie, dass es kein Schlüssel-Wert-Paar gibt, das Frankreich enthält. Der obige Code gibt also eine Laufzeitausnahme aus.

Aktualisieren Sie ein Dictionaryelement in C#

Durch Angabe eines Schlüssels im Indexer kann man den Wert eines Schlüssels ändern/aktualisieren. Wenn ein Schlüssel nicht im Dictionary gefunden wird, wird die Ausnahme KeyNotFoundException ausgelöst; Verwenden Sie daher die Funktion ContainsKey(), bevor Sie auf unbekannte Schlüssel zugreifen.

Sehen Sie sich den folgenden Code an.

var countries = new Dictionary<string, string>() { { "UK", "London, Manchester, Birmingham" },
                                                   { "USA", "Chicago, New York, Washington" },
                                                   { "PK", "Pakistan" } };

countries["UK"] = "Europe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key
// countries["France"] = "Western Europe"; //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {
  countries["France"] = "Western Europe";
}

Entfernen Sie ein Dictionaryelement in C#

Ein bereits in einem Dictionary vorhandenes Schlüssel-Wert-Paar wird mit der Methode Remove() entfernt. Alle Dictionary-Elemente werden mit der Clear()-Methode entfernt.

var countries = new Dictionary<string, string>() {
  { "UK", "UnitedKingdom" }, { "USA", "United state of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();

Hashtable in C#

Anders als Dictionary ist Hashtable eine nicht generische Sammlung. Es speichert auch Schlüssel-Wert-Paare.

Indem der Hash-Code für jeden Schlüssel berechnet und in einem separaten internen Bucket gespeichert wird, verbessert es die Suche, indem beim Zugriff auf Werte der Hash-Code des bereitgestellten Schlüssels abgeglichen wird. Werfen Sie einen Blick auf einige Merkmale des Hashtable.

Eigenschaften der Hashtable in C#

  1. Schlüssel-Wert-Paare werden in Hashtables gehalten.
  2. Es gehört zum Namensraum SystemCollection.
  3. Die Schnittstelle IDictionary wird implementiert.
  4. Schlüssel dürfen nicht null sein und müssen eindeutig sein.
  5. Werte können dupliziert oder null sein.
  6. Werte können erhalten werden, indem dem Indexer der entsprechende Schlüssel zur Verfügung gestellt wird, wie in Hashtable[key].
  7. DictionaryEntry-Objekte werden verwendet, um die Elemente zu speichern.

Erstellen einer Hashtable in C#

Schauen Sie sich den folgenden selbsterklärenden Code an, um die Erstellung einer Hashtable zu verstehen.

`Hashtable` rollno_names = new `Hashtable`();
rollno_names.Add(1, "Ali");  // adding a key/value using the Add() method
rollno_names.Add(2, "Haider");
rollno_names.Add(3, "Saad");

// The following throws runtime exception: key already added.
// rollno_names.Add(3, "Rafay");

foreach (DictionaryEntry i in rollno_names)
  Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);

// creating a `Hashtable` using collection-initializer syntax
var countries = new `Hashtable`() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

foreach (DictionaryEntry j in countries) Console.WriteLine("Key: {0}, Value: {1}", j.Key, j.Value);

Wir können die Hashtable genauso wie Dictionary erstellen. Der einzige Unterschied besteht darin, dass es nicht generisch ist, sodass wir die Datentypen von Schlüsseln und ihre entsprechenden Werte nicht angeben müssen.

Dictionary in der Hashtable in C# hinzufügen

Wir können das Objekt des Dictionary erstellen, und indem wir dieses Objekt beim Erstellen der Hashtable einfach übergeben, können wir die Dictionary-Schlüssel-Wert-Paare innerhalb der Hashtable hinzufügen.

Aktualisieren Sie die Hashtable in C#

Durch die Eingabe eines Schlüssels in den Indexer können Sie den Wert eines bestehenden Schlüssels aus der Hashtable abrufen. Da die Hashtable eine nicht generische Sammlung ist (d. h. keine Datentypen für Schlüssel und Werte), ist eine Typumwandlung in eine Zeichenfolge erforderlich, wenn Werte daraus abgerufen werden.

Sehen Sie sich den folgenden Code an.

// creating a Hashtable using collection-initializer syntax
var countries = new Hashtable() {
  { { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" } };

string countrynameUK = (string)countries["UK"];    // cast to string
string countrynameUSA = (string)countries["USA"];  // cast to string

Console.WriteLine(countrynameUK);
Console.WriteLine(countrynameUSA);

countries["UK"] = "Euorpe";    // update value of UK key
countries["USA"] = "America";  // update value of USA key

if (!countries.ContainsKey("France")) {
  countries["France"] = "Western Euorpe";
}

Entfernen von Elementen aus der Hashtabelle in C#

Die angegebenen Schlüssel-Wert-Paare einer Hashtable werden mit der Remove()-Methode entfernt. Wenn der bereitgestellte Schlüssel nicht in der Hashtable vorhanden ist, wird die Ausnahme KeyNotfoundException ausgelöst; Verwenden Sie daher vor dem Entfernen eines Schlüssels die Methode ContainsKey(), um festzustellen, ob er bereits vorhanden ist.

Verwenden Sie die Funktion Clear(), um alle Elemente auf einmal zu entfernen.

var countries = new Hashtable() {
  { "UK", "UnitedKingdom" }, { "USA", "United State of America" }, { "PK", "Pakistan" }
};

countries.Remove("UK");  // removes UK
// countries.Remove("France"); //throws run-time exception: KeyNotFoundException

if (countries.ContainsKey("France")) {  // check key before removing it
  countries.Remove("France");
}

countries.Clear();  // removes all elements

Dictionary vs. Hashtable in C#

Dictionary Hashtable
Wenn wir versuchen, einen Schlüssel zu entdecken, der nicht existiert, gibt er entweder eine Ausnahme zurück oder wirft eine Ausnahme. Wenn wir versuchen, einen Schlüssel zu entdecken, der nicht existiert, gibt er null zurück.
Weil es kein Boxen und Unboxen gibt, ist es schneller als ein Hashtable. Aufgrund des erforderlichen Ein- und Auspackens dauert es länger als ein Dictionary.
Thread-Sicherheit ist nur für öffentliche statische Member verfügbar. Die Mitglieder einer Hashtable sind alle Thread-sicher,
Da das Dictionary ein generischer Typ ist, kann jeder Datentyp damit verwendet werden (Beim Erstellen müssen wir die Datentypen sowohl für Schlüssel als auch für Werte angeben). Kein generischer Typ.
Die Hashtable-Implementierung mit stark typisierten Schlüsseln und Werten wird Dictionary genannt. Da Hashtables flexibel typisierte Datenstrukturen sind, können beliebige Schlüssel- und Werttypen hinzugefügt werden.

Aufgrund dieser Tatsachen können wir sagen, dass Dictionary gegenüber Hashtable bevorzugt wird. Da Sie jedes beliebige Element in Dictionary<TKey, TValue> einfügen können und die entnommenen Werte nicht umwandeln müssen, gewinnen Sie an Typsicherheit.

Autor: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn

Verwandter Artikel - Csharp Dictionary