Gibt es eine Möglichkeit, den Wert des angegebenen Schlüssels in der folgenden Ausnahme in C # so abzurufen, dass alle generischen Klassen betroffen sind? Ich denke, dies ist ein großer Fehler in der Ausnahmebeschreibung von Microsoft.
"The given key was not present in the dictionary."
Ein besserer Weg wäre:
"The given key '" + key.ToString() + "' was not present in the dictionary."
Lösungen können Mixins oder abgeleitete Klassen beinhalten.
c#
exception
generics
dictionary
Andreas
quelle
quelle
.ToString()
der Sinn macht. Ich stimme im Fall von a zu,Dictionary<string, *>
dass es eine nette Ergänzung zur Ausnahmebeschreibung wäre, aber es kann nicht auf alle Arten vonDictionary<*,*>
Objekten angewendet werden.Antworten:
Diese Ausnahme wird ausgelöst, wenn Sie versuchen, auf etwas zu indizieren, das nicht vorhanden ist. Beispiel:
Dictionary<String, String> test = new Dictionary<String,String>(); test.Add("Key1,"Value1"); string error = test["Key2"];
Oft ist so etwas wie ein Objekt der Schlüssel, was es zweifellos schwieriger macht, es zu bekommen. Sie können jedoch immer Folgendes schreiben (oder es sogar in eine Erweiterungsmethode einschließen):
if (test.ContainsKey(myKey)) return test[myKey]; else throw new Exception(String.Format("Key {0} was not found", myKey));
Oder effizienter (dank @ScottChamberlain)
T retValue; if (test.TryGetValue(myKey, out retValue)) return retValue; else throw new Exception(String.Format("Key {0} was not found", myKey));
Microsoft hat dies nicht getan, wahrscheinlich weil es bei den meisten Objekten nutzlos wäre. Es ist einfach genug, um es selbst zu tun, also rollen Sie einfach Ihre eigenen!
quelle
ContainsKey
der Indexer zu zwei Suchvorgängen im Wörterbuch. Ein tunTryGetValue
würde nur eine Lookup und Sie können nur die Boolesche Ausgang benutzen , um Ihre if / else Block zu wählen.Im allgemeinen Fall lautet die Antwort Nein.
Sie können den Debugger jedoch so einstellen, dass er an dem Punkt unterbrochen wird, an dem die Ausnahme zum ersten Mal ausgelöst wird. Zu diesem Zeitpunkt ist der Schlüssel, der nicht vorhanden war, als Wert im Aufrufstapel verfügbar.
In Visual Studio befindet sich diese Option hier:
Debug → Ausnahmen ... → Common Language Runtime Exceptions → System.Collections.Generic
Dort können Sie das Kontrollkästchen " Geworfen " aktivieren .
Für spezifischere Fälle, in denen Informationen zur Laufzeit benötigt werden, sofern Ihr Code verwendet
IDictionary<TKey, TValue>
und nicht direkt daran gebunden istDictionary<TKey, TValue>
, können Sie Ihre eigene Wörterbuchklasse implementieren, die dieses Verhalten bereitstellt.quelle
Wenn Sie wichtige Fehler verwalten möchten, sollten Sie TryGetValue verwenden
https://msdn.microsoft.com/en-gb/library/bb347013(v=vs.110).aspx
string value = ""; if (openWith.TryGetValue("tif", out value)) { Console.WriteLine("For key = \"tif\", value = {0}.", value); } else { Console.WriteLine("Key = \"tif\" is not found."); }
quelle
string Value = dic.ContainsKey("Name") ? dic["Name"] : "Required Name"
Mit diesem Code erhalten wir String-Daten in 'Value'. Wenn der Schlüssel 'Name' im Wörterbuch 'dic' vorhanden ist, rufen Sie diesen Wert ab, andernfalls wird die Zeichenfolge "Erforderlicher Name" zurückgegeben.
quelle
Sie können diesen Code ausprobieren
Dictionary<string,string> AllFields = new Dictionary<string,string>(); string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);
Wenn der Schlüssel nicht vorhanden ist, wird einfach ein Nullwert zurückgegeben.
quelle