webentwicklung-frage-antwort-db.com.de

Der angegebene Schlüssel war nicht im Wörterbuch vorhanden. Welcher Schlüssel?

Gibt es eine Möglichkeit, den Wert des angegebenen Schlüssels in der folgenden Ausnahme in C # auf eine Weise abzurufen, die alle generischen Klassen betrifft? Ich denke, das 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 möglicherweise Mixins oder abgeleitete Klassen beinhalten.

57
Andreas

Diese Ausnahme wird ausgelöst, wenn Sie versuchen, auf etwas zu indexieren, das nicht vorhanden ist, beispielsweise:

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 sogar in eine Erweiterungsmethode einbinden):

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 sich entschieden, dies nicht zu tun, wahrscheinlich, weil es bei den meisten Objekten nutzlos wäre. Es ist einfach genug, um sich selbst zu machen, also rollen Sie Ihre eigene!

50
BradleyDotNET

Im allgemeinen Fall lautet die Antwort Nein.

Sie können den Debugger jedoch so einstellen, dass er an dem Punkt unterbricht, an dem die Ausnahme zum ersten Mal ausgelöst wird. Zu diesem Zeitpunkt ist der nicht vorhandene Schlüssel als Wert im Aufrufstapel verfügbar.

In Visual Studio befindet sich diese Option hier:

Debuggen → Ausnahmen ... → Ausnahmen für Common Language Runtime → System.Collections.Generic

Dort können Sie das Kontrollkästchen Thrown aktivieren.


Für spezifischere Fälle, in denen Informationen zur Laufzeit benötigt werden, sofern Ihr Code IDictionary<TKey, TValue> verwendet und nicht direkt an Dictionary<TKey, TValue> gebunden ist, können Sie eine eigene Wörterbuchklasse implementieren, die dieses Verhalten bereitstellt.

14
Sam Harwell

Wenn Sie Schlüsselfehler verwalten möchten, sollten Sie TryGetValue verwenden

https://msdn.Microsoft.com/de-de/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.");
}
5
gabba

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, gibt er einfach einen Nullwert zurück.

0
Nitika Chopra