7
votes

Dictionnaire simultané dictionnaire addorupdate méthode 3ème 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;
}
I want to be able to update the dictionary if the color exists with new value. And also add to dictionary if the color is not there in dictionary.
I am using the AddOrUpdate but not able to get the 3rd parameter(form the lambda expression OR delegate method) of the AddOrUpdate method.
Any idea how my 3rd parameter would look like?    

6 commentaires

Je n'ai aucune idée de ce que vous demandez. Avez-vous vérifié la documentation du tout? msdn.microsoft.com/en-us/library/ee378665.aspx


voyez-vous le ??? dans l'addorupdate. C'est le paramètre que je manque. Des idées comment je peux former ce paramètre.


Oui - Lisez la documentation.


_Colorset.addorupdate (préfixe + colornames [I], couleur, (Colornames [i], _ colorset) => {_colorset.ecteuradd (préfixe + colornames [i], couleur); retour _colorset;});


J'ai essayé ça mais ça ne construira pas. Qu'est-ce que je fais mal.


Ceci est un bel article de blog sur la concurrence qui peut être plus lisible que l'API Doc: blogs.msdn.com/b/pfxxteam/archive/2010/01/08/9945809.aspx


3 Réponses :


1
votes

Selon la page Web ASAWYER vous a donné, ce qui est requis, c'est une fonction xxx

dans ce cas, on dirait que vous passez une chaîne et une couleur, mais comment vous voulez les peigner est en grande partie jusqu'à vous. Vous avez besoin d'une fonction qui renvoie une couleur de sorte que ce qui suit devrait fonctionner à partir d'une perspective de syntaxe. xxx

Je ne sais pas qui vous pouvez calculer la nouvelle valeur. Vous pouvez par exemple utiliser votre nouvelle couleur xxx


1 commentaires

La chaîne est la clé et la couleur est la valeur. Aucune idée de l'expression sera - je veux dire la (clé, vieillevalue) => couleur



22
votes

du Documentation :

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

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

Ceci remplacera la valeur dans la collection avec la même chose spécifiée pour L'insert: xxx

Vous pouvez effectuer une logique conditionnelle, des comparaisons entre l'ancienne valeur et la nouvelle valeur, ou mettre à jour l'objet d'origine dans la fonction, par exemple. < Pré> xxx


2 commentaires

La clé de la concurrence est le préfixe + colornies [I] et la valeur = la couleur est System.Drawing.color. Toute idée de la clé, existant vienny ??


"Touche" serait la clé de l'élément existant correspondant à cette clé, donc une valeur égale au préfixe + colornames [i]. existantValue sera l'objet System.Drawing.Color qui existe déjà dans le dictionnaire pour la clé: Préfixe + Colornames [I]. Donc, dans votre cas, la clé est une chaîne et vientval est un système.Drawing.color. Les types de données sont génériques sur la base de la manière dont vous avez déclaré les types de données génériques de la variable d'objet concurrentielle.



0
votes

On dirait que vous ne vous souciez pas si la couleur est déjà là; Vous voulez toujours mettre à jour la valeur dans le dictionnaire. Dans ce cas, vous ferez mieux d'utiliser l'indexeur normal, par ex. xxx


0 commentaires