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; }
3 Réponses :
Y a-t-il une façon de pouvoir éviter la recherche d'index pour remplacer la valeur existante? P> blockQuote>
Non pas que je connaisse - mais l'accès au dictionnaire doit être très em> rapide, sauf si vous avez une classe personnalisée qui est remplacée
gethashcode code> mal. p>
Si vous ne voyez pas de problème de performance à cause de la double recherche, je le laisserais seul. P>
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.
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);
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; }
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
code>?
@ G.stoynev oui, il fait une comparaison
si (! dict.trygetvalue (clé, valeur de sortie) | Valeur> 0) {dict [clé] = 0; } code> Vous pouvez utiliser la valeur
code>, car vous n'aurez pas dépassé le
|| code> 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) code> sur
dict [clé] = 0 code> dans les cas où vous connaissez i> La touche
code> est nouvelle.