Die Leistung ist nahezu 100% identisch. Sie können dies überprüfen, indem Sie die Klasse in Reflector.net öffnen
Dies ist der This-Indexer:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
Und das ist die Add-Methode:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Ich werde nicht die gesamte Insert-Methode veröffentlichen, da sie ziemlich lang ist. Die Methodendeklaration lautet jedoch wie folgt:
private void Insert(TKey key, TValue value, bool add)
Und weiter unten in der Funktion passiert Folgendes:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
Womit überprüft wird, ob der Schlüssel bereits vorhanden ist, und wenn dies der Fall ist und der Parameter add wahr ist, wird die Ausnahme ausgelöst.
Die Leistung ist also in jeder Hinsicht gleich.
Wie bei einigen anderen Erwähnungen geht es darum, ob Sie die Prüfung benötigen, um denselben Schlüssel zweimal hinzuzufügen.
Entschuldigung für den langen Beitrag, ich hoffe es ist okay.
Die erste Version fügt dem Wörterbuch ein neues KeyValuePair hinzu, das ausgelöst wird, wenn der Schlüssel bereits im Wörterbuch enthalten ist. Der zweite, der den Indexer verwendet, fügt ein neues Paar hinzu, wenn der Schlüssel nicht vorhanden ist, überschreibt jedoch den Wert des Schlüssels, wenn er bereits im Wörterbuch vorhanden ist.
quelle
Dictionary.Add(key, value)
undDictionary[key] = value
haben verschiedene Zwecke:Add
Methode, um ein neues Schlüssel / Wert-Paar hinzuzufügen. Vorhandene Schlüssel werden nicht ersetzt (anArgumentException
wird geworfen).quelle
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 derKeyValuePair<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:
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:
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:
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:
Was in den Eimer geht, ist db2dc565 "Pizza" (vereinfacht).
Wenn Sie den Wert ändern mit:
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:
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
quelle
Ja, das ist der Unterschied. Die Add-Methode löst eine Ausnahme aus, wenn der Schlüssel bereits vorhanden ist.
Der Grund für die Verwendung der Add-Methode ist genau dies. Wenn das Wörterbuch den Schlüssel noch nicht enthalten soll, möchten Sie normalerweise die Ausnahme, damit Sie auf das Problem aufmerksam gemacht werden.
quelle
Verwenden Sie angesichts der wahrscheinlichsten Ähnlichkeiten in der Leistung alles, was sich für den von Ihnen verwendeten Code korrekter und lesbarer anfühlt.
Ich bin der Meinung, dass eine Operation, die eine Addition beschreibt, da das Vorhandensein des Schlüssels bereits eine wirklich seltene Ausnahme darstellt, am besten mit der Addition dargestellt wird. Semantisch macht es mehr Sinn.
Das
dict[key] = value
stellt besser eine Substitution dar. Wenn ich diesen Code sehe, erwarte ich zur Hälfte, dass der Schlüssel sowieso schon im Wörterbuch ist.quelle
dic[key] = value
dass der Schlüssel bereits vorhanden war, aber ich denke, das ist umstritten;)Einer weist einen Wert zu, während der andere dem Wörterbuch einen neuen Schlüssel und Wert hinzufügt.
quelle
So fügen Sie den Wert in das Wörterbuch ein
quelle