C# dictionnaire TryGetValue avec les valeurs int, comment éviter le double de 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;
}
Est il possible que je peux éviter de recherche d'index pour remplacer la valeur existante? Je suis déjà à la vérification de la clé existe à l'aide de TryGetValue de sorte qu'il semble être un gaspillage de récupérer la valeur par l'indice de nouveau.
Sur une note séparée, comme dans le else{} une partie de mon code, il est généralement considéré comme une bonne pratique d'utiliser l'indexeur lors de l'ajout de nouveaux ou de remplacement des anciennes valeurs, et d'ajouter pour le rendre clair, vous l'ajoutez et non de le remplacer? Ou devrais-je simplement utiliser l'indexeur à chaque fois? La façon dont j'ai appris à utiliser un dictionnaire, je fais toujours un TryGetValue de recherche et dans la partie else je gérer les cas où aucune touche n'existe.
L'utilisation de l'indexeur fait une recherche IIRC ;p
est-ce que votre (condition) dépendent de
value
?oui, il fait une comparaison
Concernant votre question mineure, personnellement, je préfère
dict.Add(key, 0)
sur dict[key] = 0
dans le cas où vous le key
est nouveau.OriginalL'auteur tmakino | 2013-04-09
Vous devez vous connecter pour publier un commentaire.
Pas que je sache - mais dictionnaire de l'accès devrait être très rapide, sauf si vous avez une classe personnalisée qui est substituée
GetHashCode
mal.Si vous ne voyez pas un problème de performances en raison de la double recherche que j'avais laisser seul.
OriginalL'auteur D Stanley
Je préfère définir la commodité des méthodes d'extension pour ce genre de choses. Par exemple:
Il n'est guère besoin de s'inquiéter à propos de la performance de dictionnaire hachage & recherches - je suis surtout préoccupé par la lisibilité et la maintenabilité. Avec l'extension des méthodes, ce genre de chose est un one-liner:
(Avertissement: ne pas effectuer de la
if (condition)
check - j'ai rarement l'expérience de ces scénarios)OriginalL'auteur AlexFoxGill
Vous pouvez essayer
L'essence de l'histoire est, le type d'extraction est un type générique et est alloué sur le tas. c'est à dire lorsque vous chercher, il va sortir comme valeur. Toutefois, si vous chercher de l'objet, il sera une référence à l'original de l'objet alloué et vous pouvez modifier la valeur d'une propriété particulière de l'objet.
OriginalL'auteur Murtuza Kabul