J'ai essayé de vérifier la valeur null mais le compilateur avertit que cette condition ne se produira jamais. Que dois-je rechercher?
c#
dictionary
deltanovembre
la source
la source
ContainsKey
, ce qui est vrai, car il doit également extraire la valeur. Cependant, il ne fait pas deux recherches.Le dictionnaire lève une
KeyNotFound
exception dans le cas où le dictionnaire ne contient pas votre clé.Comme suggéré,
ContainsKey
est la précaution appropriée.TryGetValue
est également efficace.Cela permet au dictionnaire de stocker plus efficacement une valeur de null. Sans qu'il se comporte de cette façon, la vérification d'un résultat nul de l'opérateur [] indiquerait soit une valeur nulle OU la non-existence de la clé d'entrée qui n'est pas bonne.
la source
Si vous venez de vérifier avant d'essayer d'ajouter une nouvelle valeur, utilisez la
ContainsKey
méthode:Si vous vérifiez que la valeur existe, utilisez la
TryGetValue
méthode décrite dans la réponse de Jon Skeet.la source
GetValueElseAdd
méthodes auxquelles vous donnez une valeur (ou aFunc<TValue>
) pour enregistrer également la résolution sur l'insert si vous allez ajouter si ce n'est pas là. Je suppose que la raison pour laquelle il n'a pas été intégré aux bibliothèques .NET est que le chemin Ajouter est moins fréquent si vous l'utilisez dans un style de cache]TryGetValue
serait mieux, mais si vous voulez vérifier si le dictionnaire contient la clé afin d'éviter les ajouts en double, je dirais queContainsKey
c'est tout aussi bon (sinon meilleur).Vous devez vérifier Dictionary.ContainsKey (clé int) avant d'essayer d'extraire la valeur.
la source
TryGetValue
. Heureusement, je le fais maintenant, donc je le saurai à l'avenir. Je vais laisser cette réponse intacte, même si la discussion est précieuse.TryGetValue
dans une expression lambda. Bien que cela me fasse penser qu'une nouvelle extension de C # serait uncatch
opérateur similaire à l'null
opérateur de fusion.Une classe d'assistance est pratique:
la source
ContainsKey est ce que vous recherchez.
la source
Vous devriez probablement utiliser:
La raison pour laquelle vous ne pouvez pas vérifier null est que la clé ici est un type valeur.
la source
Si la clé est présente dans le dictionnaire, elle renvoie la valeur de la clé sinon elle renvoie 0.
J'espère que ce code vous aidera.
la source
TryGetValue
suffit, utilisez à lavalue
place deresult
Envisagez la possibilité d'encapsuler ce dictionnaire particulier et fournissez une méthode pour renvoyer la valeur de cette clé:
Ensuite, vous pouvez gérer le comportement de ce dictionnaire.
Par exemple ici: si le dictionnaire n'a pas la clé, il renvoie la clé que vous passez par paramètre.
la source