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 von KeyValuePair<Tkey, Tvalue>
, wobei jeder Wert durch seinen eindeutigen Schlüssel dargestellt wird. Nehmen wir an, wir haben eine Liste Ihrer Lieblingsspeisen. Jeder Wert (Nahrungsname) wird durch seinen eindeutigen Schlüssel (eine Position = wie viel Sie dieses Essen mögen) dargestellt.
Beispielcode:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Angenommen, Sie gesund bleiben wollen, haben Sie Ihre Meinung geändert haben und Sie möchten Ihre Lieblings „Burger“ mit Salat ersetzen. Ihre Liste ist immer noch eine Liste Ihrer Favoriten, Sie werden die Art der Liste nicht ändern. Dein Favorit bleibt die Nummer eins auf der Liste, nur der Wert wird sich ändern. Dies ist, wenn Sie dies anrufen:
/*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, Sie sind der Programmierer, und ab jetzt beendet Sie Ihre Sätze mit; Sie verweigern die Verwendung von Emojis, weil sie einen Kompilierungsfehler auslösen würden und die Liste der Favoriten 0-basiert ist.
Ihre Diät hat sich auch geändert! So ändern Sie Ihre Liste wieder:
/*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");
Es gibt zwei Möglichkeiten, mit der Definition, Sie wollen entweder für etwas eine neue Definition geben, nicht vor existent, oder Sie wollen Definition ändern, die bereits vorhanden ist.
Mit der Add-Methode können Sie einen Datensatz hinzufügen, aber nur unter einer Bedingung: Der Schlüssel für diese Definition ist in Ihrem Wörterbuch möglicherweise nicht vorhanden.
Jetzt werden wir unter die Haube schauen. Wenn Sie ein Wörterbuch erstellen, reserviert Ihr Compiler eine Reservierung für den Bucket (Leerzeichen im Speicher, um Ihre Datensätze zu speichern). Bucket speichert Schlüssel nicht so, wie Sie sie definieren.Jeder Schlüssel wird gehackt, bevor er in den Bucket (definiert von Microsoft) geht. Erwähnenswert ist, dass dieser Wert unverändert bleibt.
Ich verwende den CRC32-Hashing-Algorithmus, um mein Beispiel zu vereinfachen. Wenn Sie definieren:
myDietFavorites[0] = "Pizza";
Was ist mit dem Eimer geht ist db2dc565 "Pizza" (vereinfacht).
Wenn Sie den Wert ändern mit:
myDietFavorites[0] = "Spaghetti";
Sie hash Ihre 0 die wiederum db2dc565 dann schauen Sie diesen Wert in dem Eimer bis zu finden, wenn es da ist. Wenn es da ist, schreiben Sie einfach den Wert neu, der dem Schlüssel zugewiesen ist. Wenn es nicht da ist, werden Sie Ihren Wert in den Eimer legen.
Wenn Sie Funktion auf Ihrem Wörterbuch Aufruf hinzufügen:
myDietFavorite.Add(0, "Chocolate");
Sie hash Ihre 0 ist es Wert zu denen in den Eimer zu vergleichen. Sie können es in den Eimer setzen nur, wenn es nicht ist.
Es ist wichtig zu wissen, wie es funktioniert, vor allem, wenn Sie mit Dictionaries von String- oder char-Schlüsseln arbeiten. Es ist Groß- und Kleinschreibung wegen der Hashing. Also zum Beispiel "Name"! = "Name". Lassen Sie uns unsere CRC32 verwenden, um dies darzustellen.
Wert für „name“ ist: e04112b1 Wert für „Name“ ist: 1107fb5b
+1 Sehr interessant, danke für Ihren Beitrag! Es scheint, dass die Leistung hier fast identisch ist, wie die anderen Plakate angedeutet haben, jedenfalls großartig finde :) –