J'ai essayé de vérifier la valeur null mais le compilateur avertit que cette condition ne se produira jamais. Que dois-je rechercher?
J'ai essayé de vérifier la valeur null mais le compilateur avertit que cette condition ne se produira jamais. Que dois-je rechercher?
Réponses:
En supposant que vous voulez obtenir la valeur si la clé ne sont présents, utilisez Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Utiliser ContainsKey
, puis l'indexeur, fait chercher la clé deux fois, ce qui est assez inutile.)
Notez que même si vous étiez utilisez des types de référence, la vérification de null ne travaillerait - l'indexeur pour Dictionary<,>
jetteront une exception si vous demandez une clé manquante, plutôt que de retourner nulle. (C'est une grande différence entre Dictionary<,>
et Hashtable
.)
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.
Si vous venez de vérifier avant d'essayer d'ajouter une nouvelle valeur, utilisez la ContainsKey
méthode:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Si vous vérifiez que la valeur existe, utilisez la TryGetValue
méthode décrite dans la réponse de Jon Skeet.
GetValueElseAdd
méthodes auxquelles vous donnez une valeur (ou a Func<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 que ContainsKey
c'est tout aussi bon (sinon meilleur).
Vous devez vérifier Dictionary.ContainsKey (clé int) avant d'essayer d'extraire la valeur.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
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 un catch
opérateur similaire à l' null
opérateur de fusion.
Une classe d'assistance est pratique:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey est ce que vous recherchez.
Vous devriez probablement utiliser:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
La raison pour laquelle vous ne pouvez pas vérifier null est que la clé ici est un type valeur.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
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.
TryGetValue
suffit, utilisez à la value
place deresult
Envisagez la possibilité d'encapsuler ce dictionnaire particulier et fournissez une méthode pour renvoyer la valeur de cette clé:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
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.