7
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;
}

色が新しい値で存在する場合、辞書を更新できるようにしたい。色が辞書にない場合は、辞書にも追加します。
AddOrUpdate を使用していますが、AddOrUpdate メソッドの 3 番目のパラメーター (ラムダ式またはデリゲート メソッドから) を取得できません。
私の3番目のパラメータがどのように見えるか考えていますか?

4

3 に答える 3

22

ドキュメントから:

updateValueFactory 型: System.Func キーの既存の値に基づいて、既存のキーの新しい値を生成するために使用される関数

これにより、コレクション内の値が既に存在する場合はそのままになります。

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

これにより、コレクション内の値が、挿入に指定されたものと同じ値に置き換えられます。

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

たとえば、条件ロジック、古い値と新しい値の比較、または関数内の元のオブジェクトの更新を実行できます。

_colorSet.AddOrUpdate(prefix + colorNames[i], color,
            (key, existingVal) =>
            {
                if (existingVal.Name == "Red")
                    return existingVal;
                else
                    return color;
            });
于 2012-05-23T23:57:23.217 に答える
1

asawyer が提供した Web ページによると、必要なのは関数です

Func<TKey, TValue, TValue>

この場合、文字列と Color を渡しているように見えますが、それらを組み合わせる方法は主にあなた次第です。Color を返す関数が必要なので、構文の観点から次のように動作するはずです。

(key, oldValue) => oldValue

誰が新しい値を計算するのかわかりません。たとえば、新しい色を使用できます

_colorSet.AddOrUpdate(prefix + colorNames[i], color, (key, oldValue) => color); 
于 2012-05-23T23:52:36.260 に答える