Um die Frage zuerst zu beantworten, müssen wir uns den Zweck eines Wörterbuchs und der zugrunde liegenden Technologie ansehen.
Dictionary
ist die Liste, in der KeyValuePair<Tkey, Tvalue>
jeder Wert durch seinen eindeutigen Schlüssel dargestellt wird. Angenommen, wir haben eine Liste Ihrer Lieblingsspeisen. Jeder Wert (Name des Lebensmittels) wird durch seinen eindeutigen Schlüssel dargestellt (eine Position = wie sehr Sie dieses Lebensmittel mögen).
Beispielcode:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Nehmen wir an, Sie möchten gesund bleiben, Ihre Meinung geändert haben und Ihren Lieblings-Burger durch Salat ersetzen. Ihre Liste ist immer noch eine Liste Ihrer Favoriten. Sie werden die Art der Liste nicht ändern. Ihr Favorit bleibt die Nummer eins auf der Liste, nur der Wert ändert sich. Dies ist, wenn Sie dies nennen:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Aber vergessen Sie nicht, dass Sie der Programmierer sind, und von nun an beenden Sie Ihre Sätze mit; Sie lehnen die Verwendung von Emojis ab, da diese einen Kompilierungsfehler auslösen würden und die Liste aller Favoriten auf dem Index 0 basiert.
Ihre Ernährung hat sich ebenfalls geändert! Also ändern Sie Ihre Liste erneut:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
Beim Definieren gibt es zwei Möglichkeiten: Sie möchten entweder eine neue Definition für etwas geben, das vorher nicht vorhanden war, oder Sie möchten die bereits vorhandene Definition ändern.
Mit der Methode Hinzufügen können Sie einen Datensatz hinzufügen, jedoch nur unter einer Bedingung: Der Schlüssel für diese Definition ist möglicherweise nicht in Ihrem Wörterbuch vorhanden.
Jetzt schauen wir unter die Haube. Wenn Sie ein Wörterbuch erstellen, reserviert Ihr Compiler den Bucket (Speicherplätze im Speicher zum Speichern Ihrer Datensätze). Bucket speichert Schlüssel nicht so, wie Sie sie definieren. Jeder Schlüssel wird gehasht, bevor er in den von Microsoft definierten Bucket wechselt. Erwähnenswert ist, dass der Wertteil unverändert bleibt.
Ich werde den CRC32-Hashing-Algorithmus verwenden, um mein Beispiel zu vereinfachen. Wenn Sie definieren:
myDietFavorites[0] = "Pizza";
Was in den Eimer geht, ist db2dc565 "Pizza" (vereinfacht).
Wenn Sie den Wert ändern mit:
myDietFavorites[0] = "Spaghetti";
Wenn Sie Ihre 0 hashen, die wieder db2dc565 ist, suchen Sie diesen Wert in Ihrem Bucket, um festzustellen, ob er vorhanden ist. Wenn es dort ist, schreiben Sie einfach den dem Schlüssel zugewiesenen Wert neu. Wenn es nicht da ist, legen Sie Ihren Wert in den Eimer.
Wenn Sie die Funktion Hinzufügen in Ihrem Wörterbuch aufrufen, wie folgt:
myDietFavorite.Add(0, "Chocolate");
Sie haben Ihre 0 gehasht, um den Wert mit denen im Bucket zu vergleichen. Sie dürfen es nur in den Eimer legen, wenn es nicht da ist .
Es ist wichtig zu wissen, wie es funktioniert, insbesondere wenn Sie mit Wörterbüchern vom Typ string oder char arbeiten. Bei Hashing wird zwischen Groß- und Kleinschreibung unterschieden. Also zum Beispiel "Name"! = "Name". Verwenden wir unseren CRC32, um dies darzustellen.
Wert für "Name" ist: e04112b1
Wert für "Name" ist: 1107fb5b