90 votes

Incrémenter une valeur numérique dans un dictionnaire

J'utilise le code ci-dessous pour incrémenter ou insérer une valeur dans un dictionnaire. Si la clé que j'incrémente n'existe pas, j'aimerais définir sa valeur sur 1.

  public void IncrementCount(Dictionary<int, int> someDictionary, int id)
 {  
     int currentCount;
     if (someDictionary.TryGetValue(id, out currentCount))
     {
         someDictionary[id] = currentCount + 1;
     }
     else
     {
         someDictionary[id] = 1;
     }
 }

Est-ce une façon appropriée de le faire?

104voto

KingNestor Points 9123

Il s'avère qu'il était logique d'utiliser le ConcurrentDictionary qui a la méthode upsert pratique : AddOrUpdate.

Alors, je viens d'utiliser :

 someDictionary.AddOrUpdate(id, 1, (id, count) => count + 1);  

18voto

yellowblood Points 570

Voici une belle méthode d'extension :

     public static void Increment<T>(this Dictionary<T, int> dictionary, T key)
    {
        int count;
        dictionary.TryGetValue(key, out count);
        dictionary[key] = count + 1;
    }

Usage:

 var dictionary = new Dictionary<string, int>();
dictionary.Increment("hello");
dictionary.Increment("hello");
dictionary.Increment("world");

Assert.AreEqual(2, dictionary["hello"]);
Assert.AreEqual(1, dictionary["world"]);

16voto

driis Points 70872

Il est lisible et l'intention est claire. Je pense que c'est bien. Pas besoin d'inventer un code plus intelligent ou plus court ; si cela ne garde pas l'intention aussi claire que votre version initiale :-)

Ceci étant dit, voici une version un peu plus courte :

 public void IncrementCount(Dictionary<int, int> someDictionary, int id)
{
    if (!someDictionary.ContainsKey(id))
        someDictionary[id] = 0;

    someDictionary[id]++;
}

Si vous disposez d'un accès concurrent au dictionnaire, n'oubliez pas de synchroniser l'accès à celui-ci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X