web-dev-qa-db-fra.com

Récupération de la valeur du dictionnaire Meilleures pratiques

Je viens de remarquer récemment Dictionary.TryGetValue(TKey key, out TValue value) et j'étais curieux de savoir quelle est la meilleure approche pour extraire une valeur du dictionnaire.

J'ai traditionnellement fait:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

sauf si je le sais a être là.

Est-il préférable de simplement faire:

if (myDict.TryGetValue(somekey, out someVal)
    ...

Quelle est la meilleure pratique? Est-ce que l'un est plus rapide que l'autre? J'imagine que la version Try serait plus lente car elle "avalait" un try/catch et utilisait cela comme logique, non?

79
Nicholas Mancuso

TryGetValue est légèrement plus rapide, car FindEntry ne sera appelé qu'une fois.

Combien plus vite? Cela dépend de l'ensemble de données à disposition. Lorsque vous appelez la méthode Contains, Dictionary effectue une recherche interne pour trouver son index. S'il renvoie la valeur true, vous devez effectuer une autre recherche dans l'index pour obtenir la valeur réelle. Lorsque vous utilisez TryGetValue, il ne recherche qu'une fois l'index et, le cas échéant, attribue la valeur à votre variable.

FYI: Ce n'est pas vraiment une erreur.

Il appelle:

public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

ContainsKey est ceci:

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}
84
Micah

En fait, TryGetValue est plus rapide. Combien plus vite? Cela dépend de l'ensemble de données à disposition. Lorsque vous appelez la méthode Contains, Dictionary effectue une recherche interne pour trouver son index. S'il renvoie la valeur true, vous devez effectuer une autre recherche dans l'index pour obtenir la valeur réelle. Lorsque vous utilisez TryGetValue, il ne recherche qu'une fois l'index et, le cas échéant, attribue la valeur à votre variable.

Edit:

Ok, je comprends votre confusion alors laissez-moi élaborer:

Cas 1:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];

Dans ce cas, il y a 2 appels à FindEntry, un pour vérifier si la clé existe et un pour le récupérer.

Cas 2:

myDict.TryGetValue(somekey, out someVal)

Dans ce cas, il n'y a qu'un seul appel à FindKey, car l'index résultant est conservé pour l'extraction réelle dans la même méthode.

29
Diadistis

J'imagine que trygetvalue fait quelque chose de plus semblable à:

if(myDict.ReallyOptimisedVersionofContains(someKey))
{ 
  someVal = myDict[someKey];
  return true;
}
return false;

Donc, espérons pas d'essayer/attraper n'importe où.

Je pense que c'est vraiment une méthode de commodité. Je l'utilise généralement car il enregistre une ligne de code ou deux.

1
Jennifer