我想将小数添加到
ConcurrentDictionary
内的列表中
ConcurrentDictionary<string, List<decimal>> fullList =
new ConcurrentDictionary<string, List<decimal>>();
public void AddData(string key, decimal value)
{
if (fullList.ContainsKey(key))
{
var partialList = fullList[key];
partialList.Add(value);
}
else
{
fullList.GetOrAdd(key, new List<decimal>() { value });
}
}
从技术上讲,上面的代码对我有用,但只是这样做,因为我不知道如何执行
GetOrAdd
方法来添加和更新。我的问题是,考虑到我的更新将在现有列表的末尾添加一个项目,我该如何使用该方法?
您可以使用
AddOrUpdate
方法来达到此目的,如下所示:
fullList.AddOrUpdate(key,
new List<decimal>() { value },
(key,list) =>
{
list.Add(value);
return list;
});
本质上,当
key
missing 时,会创建一个仅包含一个元素 value
的新列表。否则,我们将 key
添加到与当前 value
关联的列表中,然后返回该列表。
有关此方法的文档,请查看这里。
您在寻找这样的东西吗?希望有帮助。
ConcurrentDictionary<string, List<decimal>> fullList = new ConcurrentDictionary<string, List<decimal>>();
public void AddData(string key, decimal value)
{
List<decimal> list;
if (!fullList.TryGetValue(key, out list))
{
list = new List<decimal>();
fullList.GetOrAdd(key, list);
}
list.Add(value);
}
您只需要在所有情况下调用
GetOrAdd
:
public void AddData(string key, decimal value)
{
var partialList = fullList.GetOrAdd(key, _ => new List<decimal>());
lock (partialList) partialList.Add(value); // Lock for thread safety
}
当您使用
ConcurrentDictionary
时,您应该努力使用其特殊的并发 API,以强制执行操作的原子性。分两步检查和添加 (ContainsKey
+Add
) 不是原子的,它会引入竞争条件,并可能损害应用程序的正确性。