Vorausgesetzt , dass Sie den Wert erhalten möchten , wenn der Schlüssel tut vorhanden ist , verwenden Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Wenn Sie ContainsKey
den Indexer verwenden und dann den Indexer verwenden, wird der Schlüssel zweimal nachgeschlagen, was ziemlich sinnlos ist.)
Beachten Sie, dass , auch wenn Sie wurden Referenztypen verwenden, für null Überprüfung nicht funktionieren würde - der Indexer für Dictionary<,>
eine Exception aus , wenn Sie einen fehlenden Schlüssel anfordern, anstatt null zurück. (Dies ist ein großer Unterschied zwischen Dictionary<,>
und Hashtable
.)
ContainsKey
, was wahr ist, weil es auch den Wert extrahieren muss. Es werden jedoch nicht zwei Suchvorgänge durchgeführt.Das
KeyNotFound
Wörterbuch löst eine Ausnahme aus, falls das Wörterbuch Ihren Schlüssel nicht enthält.Wie vorgeschlagen,
ContainsKey
ist die entsprechende Vorsichtsmaßnahme.TryGetValue
ist auch wirksam.Dadurch kann das Wörterbuch den Wert null effektiver speichern. Ohne dieses Verhalten würde die Überprüfung auf ein Null-Ergebnis durch den Operator [] entweder einen Nullwert oder die Nichtexistenz des Eingabeschlüssels anzeigen, was nicht gut ist.
quelle
Wenn Sie nur prüfen, bevor Sie versuchen, einen neuen Wert hinzuzufügen, verwenden Sie die folgende
ContainsKey
Methode:Wenn Sie überprüfen, ob der Wert vorhanden ist, verwenden Sie die
TryGetValue
in der Antwort von Jon Skeet beschriebene Methode.quelle
GetValueElseAdd
Methoden, mit denen Sie einen Wert (oder aFunc<TValue>
) angeben, um auch die Auflösung beim Einfügen zu speichern, wenn Sie hinzufügen möchten , wenn diese nicht vorhanden ist. Ich denke, der Grund, warum es nicht in die .NET-Bibliotheken geschafft hat, ist, dass der Add-Pfad weniger häufig ist, wenn Sie ihn in einem Cache-Stil verwenden.]TryGetValue
dies besser wäre, aber wenn Sie überprüfen möchten, ob das Wörterbuch den Schlüssel enthält, um doppelte Ergänzungen zu vermeiden, würde ich sagen, dass diesContainsKey
genauso gut ist (wenn nicht besser).Sie sollten nach Dictionary.ContainsKey (int key) suchen, bevor Sie versuchen, den Wert abzurufen.
quelle
TryGetValue
. Zum Glück mache ich das jetzt, also werde ich es in Zukunft wissen. Ich werde diese Antwort intakt lassen, obwohl die Diskussion wertvoll ist.TryGetValue
Lambda-Ausdruck verwenden konnten. Das lässt mich jedoch denken, dass eine neue Erweiterung von C # eincatch
Operator wäre , der demnull
Koaleszenzoperator ähnlich ist .Eine Helferklasse ist praktisch:
quelle
ContainsKey ist das, wonach Sie suchen.
quelle
Sie sollten wahrscheinlich verwenden:
Der Grund, warum Sie nicht nach null suchen können, ist, dass der Schlüssel hier ein Werttyp ist.
quelle
Wenn der Schlüssel im Wörterbuch vorhanden ist, gibt er den Wert des Schlüssels zurück, andernfalls wird 0 zurückgegeben.
Hoffe, dieser Code hilft dir.
quelle
TryGetValue
ist genug, verwenden Sievalue
anstelle vonresult
Ziehen Sie die Option in Betracht, dieses bestimmte Wörterbuch zu kapseln, und stellen Sie eine Methode bereit, um den Wert für diesen Schlüssel zurückzugeben:
Dann können Sie das Verhalten dieses Wörterbuchs verwalten.
Zum Beispiel hier: Wenn das Wörterbuch nicht über den Schlüssel verfügt, gibt es den Schlüssel zurück, den Sie als Parameter übergeben.
quelle