将不同的值添加到并发字典内的列表中

问题描述 投票:0回答:3

我想将小数添加到

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
方法来添加和更新。我的问题是,考虑到我的更新将在现有列表的末尾添加一个项目,我该如何使用该方法?

c# multithreading linq thread-safety concurrentdictionary
3个回答
3
投票

您可以使用

AddOrUpdate
方法来达到此目的,如下所示:

fullList.AddOrUpdate(key, 
                     new List<decimal>() { value }, 
                     (key,list) => 
                     { 
                         list.Add(value); 
                         return list; 
                     });

本质上,当

key
missing 时,会创建一个仅包含一个元素
value
的新列表。否则,我们将
key
添加到与当前
value
关联的列表中,然后返回该列表。

有关此方法的文档,请查看这里


1
投票

您在寻找这样的东西吗?希望有帮助。

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

0
投票

您只需要在所有情况下调用

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
) 不是原子的,它会引入竞争条件,并可能损害应用程序的正确性。

© www.soinside.com 2019 - 2024. All rights reserved.