Ich habe versucht, auf Null zu überprüfen, aber der Compiler warnt, dass diese Bedingung nie auftreten wird. Nach was soll ich suchen?Was passiert mit C# Dictionary <int, int> Nachschlagen, wenn der Schlüssel nicht existiert?
Antwort
Angenommen, 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
}
(Mit ContainsKey
und dann die der Indexer macht es den Schlüssel nachschlagen zweimal, das ist ziemlich sinnlos.
dass selbst wenn Sie waren Referenztypen verwendet wird, würde für null Überprüfung nicht funktionieren - 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
.)
Wenn Sie überprüfen gerade, bevor Sie einen neuen Wert, verwenden Sie die ContainsKey
Methode hinzufügen:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Wenn Sie prüfen, ob der Wert vorhanden ist, verwenden Sie die TryGetValue
Methode wie in Jon Skeet Antwort beschrieben .
TryGet besser ist –
Coz Sie die Lösung der Schlüsselsuche durch die Hash-Tabelle zweimal, wenn Sie erhalten sofort nach dem Inhalt. Wintellect PowerCollections hat auch 'GetValueElseAdd' Methoden, denen Sie einen Wert (oder einen' Func
@rub: Ich denke, das hängt vom Zweck des Codes ab. Wenn Sie den Wert verwenden möchten, stimme ich zu, dass 'TryGetValue' 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,' ContainsKey' ist genauso gut (wenn nicht besser). –
Sie sollten nach Dictionary.ContainsKey (Int-Taste) suchen, bevor Sie versuchen, den Wert herauszuziehen.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
Warum willst du es zweimal machen? –
@Jon weil es normalerweise besser liest – mookid8000
@mookid: Nicht meiner Meinung nach. Die Idee ist, zu versuchen, den Schlüssel nachzuschlagen, und einen Kurs von Handlung zu machen, wenn es gefunden wird, und eine andere Vorgehensweise andernfalls, richtig? –
ContainsKey ist, was Sie suchen.
Sie sollten wahrscheinlich verwenden:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
Der Grund, warum Sie nicht für null überprüfen kann, ist, dass der Schlüssel hier ein Werttyp ist.
Der Typ des Wertes ist irrelevant, da die Überprüfung auf Null nicht den gewünschten Effekt haben würde. –
@Johannes, Jon's Lösung ist natürlich viel besser, aber der Fragesteller hat festgestellt, dass er überprüft hat, ob der Schlüssel existiert, und es ist ein Dictionary
Das Wörterbuch löst eine KeyNotFound
Ausnahme aus, falls das Wörterbuch Ihren Schlüssel nicht enthält.
Wie vorgeschlagen, ContainsKey
ist die entsprechende Vorsichtsmaßnahme. TryGetValue
ist auch effektiv.
Dies ermöglicht dem Wörterbuch, einen Wert von Null effektiver zu speichern. Ohne dieses Verhalten würde das Prüfen auf ein Null-Ergebnis des Operators [] entweder einen Nullwert ODER die Nicht-Existenz des Eingabeschlüssels anzeigen, was nicht gut ist.
Weitere Informationen finden Sie unter MSDN: http://msdn.microsoft.com/en-gb/library/9tee9ht2.aspx – cyberzed
Eine Hilfsklasse ist praktisch:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if(dictionary.TryGetValue(key, out val))
{
return val;
}
return defaultVal;
}
}
- 1. Was passiert, wenn im Dictionary-Schlüssel eine Hash-Kollision auftritt?
- 2. C# dictionary <> fehlender Schlüssel
- 3. C# Dictionary <> und änderbare Schlüssel
- 4. konvertieren Dictionary <int, Enumerable> zu Dictionary <int, Enumerable> invertieren Inhalt
- 5. MediaRecorder.setMaxDuration (int-Timer), was passiert, wenn der Timer
- 6. C# erweitern Wohnung Liste <T> auf Dictionary <T, ICollection <int>>
- 7. C# Dictionary mit zwei Werten pro Schlüssel?
- 8. Hinzufügen von Elementen zu einem Dictionary <Int, Liste <int>>
- 9. Nächster Schlüssel in C# Dictionary
- 10. sollte ich ++ wordCount [Schlüssel] für unordered_map <string, int> verwenden, wenn Schlüssel in WordCount nicht existiert?
- 11. C# Linq Abfrage zurückgeben Wörterbuch <int,int[]>
- 12. Was passiert, wenn make_shared
- 13. C# Dictionary Memory Management
- 14. Was passiert, wenn der shared_ptr-Konstruktor fehlschlägt?
- 15. Was ist schneller/effizienter: Dictionary <string, object> oder Dictionary <enum,object>?
- 16. Konvertieren Sie das Wörterbuch <String,Int> in Dictionary <String, SomeEnum> mit LINQ?
- 17. Was passiert, wenn Sie ein Zeichen, das nicht im Ascii-Diagramm steht, in C++ int eingeben?
- 18. Einfachste Möglichkeit, ein Dictionary <int, Dictionary <int, Foo>> zu IEnumerable <IEnumerable <Foo>> in Linq zu transformieren?
- 19. Was passiert, wenn veröffentlicht
- 20. Was passiert, wenn Sie `if Schlüssel in dict` aufrufen
- 21. Const Dictionary in C#
- 22. Was ist der <C-w> Schlüssel in Vim?
- 23. Wörterbuch konvertieren <int, Parent> auf Dictionary <int, Childobject> LINQ
- 24. C++ was passiert mit meiner ifstream.get() Funktion?
- 25. was passiert mit einer statischen c-Funktion, die nicht
- 26. Was passiert, wenn das Ergebnis der reduceByKey (_ + _) nicht überschreiten int Bereich
- 27. Dictionary in C++ mit einer Map ohne Werte, nur Schlüssel
- 28. Enum als Dictionary-Schlüssel
- 29. Wörterbuch Rückkehr einen Standardwert, wenn der Schlüssel nicht
- 30. How to make Wörterbuch <int, int> von Javascript
@JonSkeet Ist nicht TryGetValue auch eine doppelte Suche ([wie in dieser Frage body] (http://stackoverflow.com/questions/1413304/net-adding-dictionary-item-check-if-it-exists-) oder-Zulassen-Ausnahme))? – nawfal
@ Nawfal: Ich sehe keinen Hinweis darauf, dass diese Frage überhaupt besagt. Es sagt, es macht mehr Arbeit als 'ContainsKey', was wahr ist, weil es auch den Wert extrahieren muss. Es tut aber nicht zwei Lookups. –
Naiv, ich habe immer Null erwartet, aber für das Dictionary gibt dies das "0" -Äquivalent in der Enum zurück. –
Jess