并发字典添加或更新方法第 3 个参数
本文关键字:参数 新方法 更新 字典 添加 并发 | 更新日期: 2023-09-27 18:35:13
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 表达式或委托方法)。
知道我的第三个参数会是什么样子吗?
从文档中:
更新价值工厂 类型:系统功能。 用于根据现有键的现有值为现有键生成新值的函数
如果集合中的值已存在,这将保留该值:
_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;
});
根据asawyer给你的网页,需要的是一个函数
Func<TKey, TValue, TValue>
在这种情况下,看起来您正在传递一个字符串和一个颜色,但您希望如何梳理它们在很大程度上取决于您。您需要一个返回 Color 的函数,以便从语法角度来看,以下内容应该有效。
(key, oldValue) => oldValue
我不知道你可以为谁计算新值。例如,您可以使用新颜色
_colorSet.AddOrUpdate(prefix + colorNames[i], color, (key, oldValue) => color);
看起来你不在乎颜色是否已经存在;你总是想更新字典中的值。在这种情况下,最好使用普通索引器,例如
_colorSet[prefix + colorNames[i]] = color;