7 votes

Méthode simultanée de dictionnaire AddOrUpdate 3e paramètre ?

private readonly ConcurrentDictionary<string, System.Drawing.Color> _colorSet;      

public void BuildColorSet(IList<string> colorNames, string prefix, bool forceLastToGray)
{
    var size = forceLastToGray ? colorNames.Count - 1 : colorNames.Count;

    int nbHue = 6;
    int nbCycle = (int)Math.Ceiling((double)size / nbHue);

    var saturationMax = nbCycle <= 2 ? 1.0 : 1.0;
    var saturationMin = 0.3;
    var luminanceMax = nbCycle <= 2 ? 0.85 : 0.85;
    var luminanceMin = 0.3;
    var maxSaturationShift = 0.30;
    var maxLuminanceShift = 0.15;

    var interval = 1.0 / Math.Min(size, nbHue);

    var saturationShift = (saturationMax - saturationMin) / (nbCycle - 1);
    saturationShift = Math.Min(saturationShift, maxSaturationShift);
    var luminanceShift = (luminanceMax - luminanceMin) / (nbCycle - 1);
    luminanceShift = Math.Min(luminanceShift, maxLuminanceShift);

    var hueShift = 0.0;

    var saturation = saturationMax;
    var luminance = luminanceMax;
    for(var i = 0; i<size; i++)
    {
        if(i > 0 && (i % nbHue == 0)) // Next Cycle
        {
            saturation -= saturationShift;
            luminance -= luminanceShift;
            hueShift = hueShift == 0 ? interval/2 : 0;
        }
        var hue = interval*(i%nbHue) + hueShift;

        System.Drawing.Color color = HSL2RGB(hue, saturation, luminance);

    _colorSet.AddOrUpdate(prefix + colorNames[i], color, ???);
    }
    if(forceLastToGray)
    {
        _colorSet.TryAdd(prefix + colorNames[colorNames.Count - 1], System.Drawing.Color.LightGray);
    }

    _cssDirty = true;
}

Je veux pouvoir mettre à jour le dictionnaire si la couleur existe avec une nouvelle valeur. Et aussi ajouter au dictionnaire si la couleur n'est pas présente dans le dictionnaire.
J'utilise la méthode AddOrUpdate mais je n'arrive pas à obtenir le troisième paramètre (de l'expression lambda ou de la méthode déléguée) de la méthode AddOrUpdate.
Une idée de ce à quoi ressemblerait mon troisième paramètre ?

22voto

ulty4life Points 1842

De la documentation :

updateValueFactory Type : System.Func La fonction utilisée pour générer une nouvelle valeur pour une clé existante sur la base de la valeur existante de la clé.

Cela laissera la valeur dans la collection seule si elle existe déjà :

_colorSet.AddOrUpdate(prefix + colorNames[i], color,
            (key, existingVal) =>
            {
                return existingVal;
            });

Cela remplacera la valeur dans la collection avec la même valeur que celle spécifiée pour l'insertion :

_colorSet.AddOrUpdate(prefix + colorNames[i], color,
            (key, existingVal) =>
            {
                return color;
            });

Vous pouvez effectuer une logique conditionnelle, des comparaisons entre l'ancienne et la nouvelle valeur, ou mettre à jour l'objet original dans la fonction, par exemple.

_colorSet.AddOrUpdate(prefix + colorNames[i], color,
            (key, existingVal) =>
            {
                if (existingVal.Name == "Red")
                    return existingVal;
                else
                    return color;
            });

1voto

Ade Miller Points 7750

Selon la page web que asawyer vous a donnée, ce qui est requis est une fonction

Func<TKey, TValue, TValue>

Dans ce cas, il semble que vous transmettiez une chaîne et une couleur, mais la façon dont vous souhaitez les combiner dépend largement de vous. Vous avez besoin d'une fonction qui renvoie une couleur, ce qui devrait fonctionner du point de vue de la syntaxe.

(key, oldValue) => oldValue

Je n'ai aucune idée de qui vous pourriez calculer la nouvelle valeur. Vous pourriez par exemple utiliser votre nouvelle couleur

_colorSet.AddOrUpdate(prefix + colorNames[i], color, (key, oldValue) => color);

0voto

Rory Points 13087

Il semble que vous ne vous souciez pas de savoir si la couleur est déjà là ; vous voulez toujours mettre à jour la valeur dans le dictionnaire. Dans ce cas, il est préférable d'utiliser l'indexeur normal, par ex.

_colorSet[prefix + colorNames[i]] = color;

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