292 votes

Méthode pour ajouter un nouvel élément ou mettre à jour un élément existant dans le dictionnaire

Dans certains codes hérités, j'ai vu la méthode d'extension suivante pour faciliter l'ajout d'un nouvel élément clé-valeur ou la mise à jour de la valeur, si la clé existe déjà.

Méthode-1 (code hérité).

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

Bien que j'aie vérifié que map[key]=value fait exactement le même travail. C'est-à-dire que cette méthode pourrait être remplacée par la Méthode-2 ci-dessous.

Méthode-2.

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

Maintenant, ma question est.. Y a-t-il un problème si je remplace la méthode 1 par la méthode 2 ? Est-ce que ça va casser dans n'importe quel scénario possible ?

De plus, je pense que c'était la différence entre HashTable et Dictionary. HashTable permet de mettre à jour un élément, ou d'ajouter un nouvel élément en utilisant un indexeur, alors que Dictionary ne le permet pas ! Cette différence a-t-elle été éliminée dans les versions C# > 3.0 ?

L'objectif de cette méthode n'est pas de lever une exception si l'utilisateur envoie à nouveau la même clé-valeur, la méthode doit simplement mettre à jour l'entrée avec la nouvelle valeur, et créer une nouvelle entrée si une nouvelle paire clé-valeur a été envoyée à la méthode.

3voto

StepUp Points 246

Je sais que ce n'est pas Dictionary<TKey, TValue> mais vous pouvez éviter KeyNotFoundException tout en incrémentant une valeur comme :

dictionary[key]++; // throws `KeyNotFoundException` if there is no such key  

en utilisant ConcurrentDictionary<TKey, TValue> et sa très belle méthode AddOrUpdate(). .

Laissez-moi vous montrer un exemple :

var str = "Hellooo!!!";
var characters = new ConcurrentDictionary<char, int>();
foreach (var ch in str)
    characters.AddOrUpdate(ch, 1, (k, v) => v + 1);

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