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
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);
}
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.
Pourquoi a-t-il reçu un downvote? S'il vous plaît expliquer si je peux améliorer la réponse. – Peter
Pourriez-vous expliquer pourquoi vous n'aimez pas utiliser 'out' à moins d'y être obligé? –
@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
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.
Exactement pourquoi j'ai posé cette question, je me sentais comme ce que je faisais n'était pas une bonne pratique. –
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
É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
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. –
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
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.
- 1. Meilleure façon de gérer une exception de précondition type?
- 2. KeyNotFoundException: Exception de base de données SQLCE
- 3. meilleure façon de gérer JSON dans django
- 4. Meilleure façon de gérer les messages d'erreur
- 5. Meilleure façon de gérer différents types d'utilisateurs?
- 6. Meilleure façon de gérer une liste d'email. NET
- 7. Meilleure façon de gérer RoutingError dans Rails 2.1.x?
- 8. Quelle est la meilleure façon de gérer les exceptions ObjectDataSource?
- 9. Meilleure façon de gérer la session dans NHibernate?
- 10. Meilleure façon de gérer plusieurs colonnes de défilement
- 11. Meilleure façon de gérer les variables de requête dans Django
- 12. La meilleure façon de gérer un changement dans 'ceci'
- 13. ASP.NET: Meilleure façon de gérer les ressources globales?
- 14. Meilleure façon de gérer la connexion à une base de données pour une servlet Java
- 15. XLinq - Une meilleure façon
- 16. Comment puis-je gérer une exception dans DataSet.Designer.cs?
- 17. Meilleure façon de gérer plusieurs conditions de requêtes possibles sur une page d'index
- 18. Quelle est la meilleure façon de déclencher une exception en C#?
- 19. Quelle est la meilleure façon de gérer l'anglais et le chinois dans une application Flex?
- 20. meilleure façon de gérer plusieurs threads dans une application Win Forms
- 21. Une meilleure façon de concevoir cette boucle?
- 22. F #: Meilleure façon de démultiplier une API?
- 23. Quelle est la meilleure façon de gérer ce cas "try-error-clean -retry"?
- 24. Meilleure façon de réorganiser une ArrayList en Java
- 25. Les antivirus verrouillent et suppriment les fichiers temporaires - la meilleure façon de les gérer?
- 26. Meilleure façon de dépendre de swfObject dans une bibliothèque
- 27. Meilleure façon de gérer un 404 dans un gestionnaire HTTP de téléchargement de fichier?
- 28. Meilleure façon de concevoir et de gérer un menu de navigation dans les applications Web
- 29. Quelle est la meilleure façon de gérer plusieurs connexions de base de données dans C#
- 30. Meilleure façon de synchroniser ObservableCollection et ObjectContext?
bonne réponse merci –
Est-ce toujours conseillé au lieu de ContainsKey()? –
@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? –