web-dev-qa-db-fra.com

Qu'advient-il de la recherche dans le dictionnaire C # <int, int> si la clé n'existe pas?

J'ai essayé de vérifier null mais le compilateur prévient que cette condition ne se produira jamais. Que devrais-je rechercher?

106
deltanovember

En supposant que vous souhaitiez obtenir la valeur si la clé existe , 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 apparaître la clé deux fois, ce qui est plutôt inutile.)

Notez que même si utilisiez des types de référence, la recherche de la valeur NULL ne fonctionnerait pas - l'indexeur pour Dictionary<,> lancera une exception si vous demandez une clé manquante, plutôt que de renvoyer null. (Ceci est une grande différence entre Dictionary<,> et Hashtable.)

172
Jon Skeet

Le dictionnaire lève une exception KeyNotFound si 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 null. Sans ce comportement, la recherche d'un résultat nul par l'opérateur [] indiquerait soit une valeur nulle OR la non-existence de la clé d'entrée qui n'est pas bonne.).

23
antik

Si vous ne faites que vérifier avant d'essayer d'ajouter une nouvelle valeur, utilisez la méthode ContainsKey :

if (!openWith.ContainsKey("ht"))
{
    openWith.Add("ht", "hypertrm.exe");
}

Si vous vérifiez que la valeur existe, utilisez la méthode TryGetValue comme décrit dans la réponse de Jon Skeet.

10
ChrisF

Vous devriez vérifier Dictionary.ContainsKey (int key) 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.
}
2
ZombieSheep

ContainsKey est ce que vous recherchez.

0
Will

Vous devriez probablement utiliser:

if(myDictionary.ContainsKey(someInt))
{
  // do something
}

La raison pour laquelle vous ne pouvez pas vérifier la valeur null est que la clé ici est un type de valeur.

0
Razzie

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;
    }
}
0
sheamus
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.

Espérons que ce code vous aide.

0
Nitika Chopra