8
votes

C # Dictionnaire trygetvalue avec des valeurs int, comment éviter la double recherche

Lorsque vous faites quelque chose comme:

int value;
if (dict.TryGetValue(key, out value))
{
    if (condition)
    {
        //value = 0;  this copies by value so it doesn't change the existing value
        dict[key] = 0;
    }
}
else
{
    dict[key] = 0;
}


7 commentaires

Vous ne le regardez pas deux fois.


@ Daniela.white: utiliser l'indexeur fait une recherche IIRC; p


Est-ce que votre (condition) dépend de la valeur ?


@ G.stoynev oui, il fait une comparaison


si (! dict.trygetvalue (clé, valeur de sortie) | Valeur> 0) {dict [clé] = 0; } Vous pouvez utiliser la valeur , car vous n'aurez pas dépassé le || si le tryget a fonctionné.


Cela semble presque comme si vous souhaitez une référence au seau que la valeur sera stockée. Ceci n'est pas exposé dans .NET. De plus, vous devriez faire face à un godet de valeur qui pourrait être délicat.


En ce qui concerne votre question mineure, je préférerais personnellement dict.add (clé, 0) sur dict [clé] = 0 dans les cas où vous connaissez La touche est nouvelle.


3 Réponses :


5
votes

Y a-t-il une façon de pouvoir éviter la recherche d'index pour remplacer la valeur existante?

Non pas que je connaisse - mais l'accès au dictionnaire doit être très rapide, sauf si vous avez une classe personnalisée qui est remplacée gethashcode mal.

Si vous ne voyez pas de problème de performance à cause de la double recherche, je le laisserais seul.


1 commentaires

Merci, cela ne conduit pas à un problème de performance, mais que ce modèle se présente fréquemment pour moi, je pensais que je demanderais une fois et apprendre la manière optimale de le faire.



0
votes

Je préfère définir des méthodes d'extension de commodité pour des choses comme celle-ci. Par exemple:

int value = dict.GetOrSet(key, 0);


0 commentaires

2
votes

Vous pouvez essayer cela sur

Object value;
if (dict.TryGetValue(key, out value))
{
    if (condition)
    {
        //value.data = 0;  this copies by value so it doesn't change the existing value
        value.data = 0;
    }
}
else
{
    value.data = 0;
}


0 commentaires