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#
- Es speichert Schlüssel-Wert-Paare.
- Sein Namespace ist
System.Collections.Generic
. - Die Schlüssel im
Dictionary
dürfen nicht null sein und sollten eindeutig sein. - Werte können jedoch null sein und dupliziert werden.
- Wir können auf den Datenwert über den entsprechenden Schlüssel zugreifen, z. B.
myDictionary[key]
. - 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#
- Schlüssel-Wert-Paare werden in
Hashtables
gehalten. - Es gehört zum Namensraum
SystemCollection
. - Die Schnittstelle
IDictionary
wird implementiert. - Schlüssel dürfen nicht null sein und müssen eindeutig sein.
- Werte können dupliziert oder null sein.
- Werte können erhalten werden, indem dem Indexer der entsprechende Schlüssel zur Verfügung gestellt wird, wie in
Hashtable[key]
. 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.
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