118 votes

ConcurrentDictionary AddOrUpdate

J'essaye de réécrire du code en utilisant Dictionary pour utiliser ConcurrentDictionary. J'ai examiné quelques exemples, mais je ne parviens toujours pas à implémenter la fonction AddOrUpdate. C'est le code original:

     dynamic a = HttpContext;
    Dictionary<int, string> userDic = this.HttpContext.Application["UserSessionList"] as Dictionary<int, String>;

   if (userDic != null)
   {
      if (useDic.ContainsKey(authUser.UserId))
      {
        userDic.Remove(authUser.UserId);
      }
   }
  else
  {
     userDic = new Dictionary<int,string>();
  }
  userDic.Add(authUser.UserId, a.Session.SessionID.ToString());
  this.HttpContext.Application["UserDic"] = userDic;
 

Je ne sais pas quoi ajouter pour la partie mise à jour:

 userDic.AddOrUpdate(authUser.UserId,
                    a.Session.SessionID.ToString(),
                    /*** what to add here? ***/);
 

Tous les pointeurs seraient appréciés.

237voto

M4N Points 48758

Vous devez passer un Func qui renvoie la valeur à stocker dans le dictionnaire en cas de mise à jour. Je suppose que dans votre cas (puisque vous ne faites pas la distinction entre ajouter et mettre à jour), cela serait:

 var sessionId = a.Session.SessionID.ToString();
userDic.AddOrUpdate(
  authUser.UserId,
  sessionId,
  (key, oldValue) => sessionId);
 

C'est-à-dire que Func renvoie toujours l'identificateur sessionId, de sorte que les options Ajouter et Mettre à jour définissent la même valeur.

BTW: il y a un exemple sur la page MSDN .

30voto

steve Points 1057

J'ai fini par implémenter une méthode d'extension:

 static class ExtensionMethods
{
    // Either Add or overwrite
    public static void AddOrUpdate<K, V>(this ConcurrentDictionary<K, V> dictionary, K key, V value)
    {
        dictionary.AddOrUpdate(key, value, (oldkey, oldvalue) => value);
    }
}
 

1voto

Nicolas Points 18

Pour ceux que cela intéresse, je suis en train de mettre en place un cas qui est un excellent exemple d'utilisation de la valeur "oldValue" ou de la valeur existante au lieu d'en forcer une nouvelle (personnellement, je n'aime pas le terme "oldValue", car ce n'est pas vieux quand il a été créé il y a quelques ticks de processeur dans un thread parallèle).

 dictionaryCacheQueues.AddOrUpdate(
    uid,
    new ConcurrentQueue<T>(),
    (existingUid, existingValue) => existingValue
);
 

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