2009-03-03 9 views
50

J'utilise un dictionnaire pour effectuer des recherches sur un programme sur lequel je travaille. Je cours un tas de clés à travers le dictionnaire, et je m'attends à ce que certaines touches n'aient pas de valeur. J'attrape le KeyNotFoundException là où il se produit, et l'absorbe. Toutes les autres exceptions se propageront vers le haut. Est-ce la meilleure façon de gérer cela? Ou devrais-je utiliser une recherche différente? Le dictionnaire utilise un int comme clé et une classe personnalisée comme valeur.Meilleure façon de gérer une exception KeyNotFoundException

Répondre

88

Utilisation Dictionary.TryGetValue à la place:

Dictionary<int,string> dictionary = new Dictionary<int,string>(); 
int key = 0; 
dictionary[key] = "Yes"; 

string value; 
if (dictionary.TryGetValue(key, out value)) 
{ 
    Console.WriteLine("Fetched value: {0}", value); 
} 
else 
{ 
    Console.WriteLine("No such key: {0}", key); 
} 
+1

bonne réponse merci –

+0

Est-ce toujours conseillé au lieu de ContainsKey()? –

+0

@SvenB: Oui, je le dirais. Pourquoi faire la recherche deux fois, une fois pour vérifier l'existence de la clé, puis une fois pour obtenir la valeur, quand vous pouvez les faire tous les deux en même temps? –

31

Essayez d'utiliser: Dict.ContainsKey

Edit:
Performance je pense sage Dictionary.TryGetValue est mieux que d'autres ont suggéré, mais je n'aime pas utiliser quand je n'ai pas, à mon avis ContainsKey est plus lisible mais nécessite plus de lignes de code si vous en avez également besoin.

+0

Pourquoi a-t-il reçu un downvote? S'il vous plaît expliquer si je peux améliorer la réponse. – Peter

+0

Pourriez-vous expliquer pourquoi vous n'aimez pas utiliser 'out' à moins d'y être obligé? –

+1

@wilbishardis c'est juste une habitude, à mon avis je pense qu'il est plus difficile de manquer qu'un paramètre de méthode peut être modifié beaucoup plus clair quand vous avez un signe =. maintenant c'est juste mon opinion et cela ne veut pas dire que tout le monde ressent la même chose, et dans certains cas c'est la meilleure option 'int.TryParse' est un exemple .. – Peter

4

vous devez utiliser la méthode 'ContainsKey (touche string)' du dictionnaire pour vérifier si une clé existe. L'utilisation d'exceptions pour un flux de programme normal n'est pas considérée comme une bonne pratique.

+2

Exactement pourquoi j'ai posé cette question, je me sentais comme ce que je faisais n'était pas une bonne pratique. –

11

Voici une élégante, une solution de ligne (Gardez à l'esprit ce qui rend la recherche deux fois. Voir ci-dessous pour la version TryGetValue de ce qui doit être utilisé dans les boucles de longue durée.)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default"; 

Pourtant, je Je dois le faire chaque fois que j'accède à un dictionnaire. Je préférerais retourner null Je peux simplement écrire:

string value = dictionary[key] ?? "default";//this doesn't work 
+0

Évitez d'utiliser cette solution car elle nécessite deux recherches sur le dictionnaire. Une recherche pour 'dictionary.ContainsKey' et une autre pour' dictionary [clé] '. Utilisez la réponse de @ JernejNovak pour de meilleures performances. – FrankerZ

+0

Parfois, la performance n'est pas une priorité et la lisibilité est plus importante. La réponse de Jon Skeet n'est pas quelque chose que vous voulez dispersé partout dans votre code. Je dirais qu'il faut éviter cela en grandes boucles. Je ferai une note dans ma réponse. Mais ça ne vaut vraiment pas le coup. –

+0

Comment est la chaîne de caractères = dictionary.ContainsKey (key)? dictionary [clé]: "default"; 'plus lisible que string valeur = dictionary.TryGetValue (clé, valeur out)? valeur: "No key!"; ' – FrankerZ

14

Une solution de ligne à l'aide TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!"; 

Soyez conscient que valeur variable doit être de type quel dictionnaire rendement dans ce cas chaîne. Ici vous ne pouvez pas utiliser var pour la déclaration de variable.

Questions connexes