web-dev-qa-db-fra.com

La clé donnée n'était pas présente dans le dictionnaire. Quelle clé?

Existe-t-il un moyen d'obtenir la valeur de la clé donnée dans l'exception suivante en C # d'une manière qui affecte toutes les classes génériques? Je pense que c'est un gros manque dans la description de l'exception de Microsoft.

"The given key was not present in the dictionary."

Une meilleure façon serait:

"The given key '" + key.ToString() + "' was not present in the dictionary."

Les solutions peuvent impliquer des mixins ou des classes dérivées peut-être.

57
Andreas

Cette exception est levée lorsque vous essayez d'indexer quelque chose qui n'existe pas, par exemple:

Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];

Souvent, quelque chose comme un objet sera la clé, ce qui rend sans aucun doute plus difficile à obtenir. Cependant, vous pouvez toujours écrire ce qui suit (ou même l'envelopper avec une méthode d'extension):

if (test.ContainsKey(myKey))
   return test[myKey];
else
   throw new Exception(String.Format("Key {0} was not found", myKey));

Ou plus efficace (grâce à @ScottChamberlain)

T retValue;
if (test.TryGetValue(myKey, out retValue))
    return retValue;
else
   throw new Exception(String.Format("Key {0} was not found", myKey));

Microsoft a choisi de ne pas le faire, probablement parce que cela ne servirait à rien s'il est utilisé sur la plupart des objets. C'est assez simple à faire soi-même, alors roulez les vôtres!

50
BradleyDotNET

Dans le cas général, la réponse est non.

Cependant, vous pouvez configurer le débogueur pour qu'il se termine au moment où l'exception est levée pour la première fois. À ce moment, la clé qui n'était pas présente sera accessible en tant que valeur dans la pile d'appels.

Dans Visual Studio, cette option se trouve ici:

Débogage → Exceptions ... → Exceptions du Common Language Language → System.Collections.Generic

Là, vous pouvez cocher la case Jeté .


Pour des cas plus spécifiques où des informations sont nécessaires au moment de l'exécution, à condition que votre code utilise IDictionary<TKey, TValue> et non lié directement à Dictionary<TKey, TValue>, vous pouvez implémenter votre propre classe de dictionnaire offrant ce comportement.

14
Sam Harwell

Si vous voulez gérer les clés manquantes, vous devez utiliser TryGetValue

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.");
}
5
gabba

Vous pouvez essayer ce code

Dictionary<string,string> AllFields = new Dictionary<string,string>();  
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);

Si la clé n'est pas présente, elle renvoie simplement une valeur null.

0
Nitika Chopra