并发字典AddOrUpdate方法第3个参数?

时间:2012-05-23 23:31:58

标签: c# asp.net .net asp.net-mvc

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个参数(形成lambda表达式OR委托方法)。
知道我的第三个参数怎么样?

3 个答案:

答案 0 :(得分:18)

来自documentation

  

updateValueFactory       键入:System.Func       用于根据密钥的现有值

为现有密钥生成新值的函数

如果该值已经存在,这将使该集合中的值保持不变:

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

这将使用为insert插入指定的值替换集合中的值:

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

答案 1 :(得分:1)

根据asawyer给你的网页,需要的是一个功能

Func<TKey, TValue, TValue>

在这种情况下,它看起来像是在传递一个字符串和一个颜色,但你想要如何梳理它们在很大程度上取决于你。您需要一个返回Color的函数,因此以下内容应该从语法角度出发。

(key, oldValue) => oldValue

我不知道你可以计算新值。例如,您可以使用新颜色

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

答案 2 :(得分:0)

看起来你不在乎颜色是否已经存在;你总是想要更新字典中的值。在这种情况下,您最好使用普通索引器,例如

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