Um diese Frage zu beantworten, müssen wir zunächst einen Blick auf den Zweck eines Wörterbuchs und die zugrunde liegende Technologie werfen.
Dictionary
ist die Liste der KeyValuePair<Tkey, Tvalue>
wobei jeder Wert durch seinen eindeutigen Schlüssel dargestellt wird. Nehmen wir an, 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).
Beispiel-Code:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Angenommen, Sie wollen gesund bleiben, haben Ihre Meinung geändert und wollen Ihren Lieblings-Burger durch Salat ersetzen. Ihre Liste ist immer noch eine Liste mit Ihren Lieblingsgerichten, Sie werden die Art der Liste nicht ändern. Ihr Lieblingsessen bleibt die Nummer eins auf der Liste, nur sein Wert ändert sich. Dies ist der Moment, in dem Sie dies aufrufen:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Aber vergiss nicht, dass du der Programmierer bist, und von nun an beendest du deine Sätze mit ; du weigerst dich, Emojis zu verwenden, weil sie einen Kompilierungsfehler verursachen würden, und alle Favoritenlisten basieren auf dem Index 0.
Auch Ihre Ernährung hat sich 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: Entweder man will eine neue Definition für etwas geben, das es vorher nicht gab, oder man will eine bereits vorhandene Definition ändern.
Mit der Add-Methode können Sie einen Datensatz hinzufügen, allerdings nur unter einer Bedingung: Der Schlüssel für diese Definition darf nicht in Ihrem Wörterbuch vorhanden sein.
Jetzt werden wir unter die Haube schauen. Wenn Sie ein Wörterbuch erstellen, reserviert Ihr Compiler einen Bucket (Speicherplatz zum Speichern der Datensätze). Buckets speichern die Schlüssel nicht so, wie Sie sie definieren. Jeder Schlüssel wird gehasht, bevor er im Bucket gespeichert wird (von Microsoft definiert), wobei der Wert unverändert bleibt.
Zur Vereinfachung meines Beispiels verwende ich den CRC32-Hash-Algorithmus. Wenn Sie definieren:
myDietFavorites[0] = "Pizza";
Was in den Eimer kommt, ist db2dc565 "Pizza" (vereinfacht).
Wenn Sie den Wert in mit ändern:
myDietFavorites[0] = "Spaghetti";
Sie hacken Ihre 0, die wiederum db2dc565 dann suchen Sie diesen Wert in Ihrem Eimer, um herauszufinden, ob er dort vorhanden ist. Wenn er vorhanden ist, schreiben Sie den dem Schlüssel zugewiesenen Wert einfach um. Wenn er nicht vorhanden ist, legen Sie Ihren Wert in den Bereich.
Wenn Sie die Funktion Hinzufügen für Ihr Wörterbuch aufrufen, z. B:
myDietFavorite.Add(0, "Chocolate");
Du hasst deine 0, um ihren Wert mit Einsen im Eimer zu vergleichen. Sie können sie in den Eimer legen nur wenn er nicht da ist .
Es ist wichtig zu wissen, wie es funktioniert, vor allem, wenn Sie mit Wörterbüchern von String- oder Char-Typ Schlüssel arbeiten. Die Groß- und Kleinschreibung wird beim Hashing unterschieden. Also zum Beispiel "Name" != "Name". Verwenden wir unseren CRC32, um dies darzustellen.
Der Wert für "Name" ist: e04112b1 Der Wert für "Name" ist: 1107fb5b