如何在ConcurrentDictionary <string,ilist <object =“”>&gt;中添加项目

时间:2016-09-07 04:23:28

标签: c# concurrentdictionary

我有&gt;的并发字典让对象称为神器。

我想添加一个新对象。该对象通常包含键列表,我有一个函数来获取这些键。

我知道如果密钥不存在,如何添加到字典但我不知道如果密钥已经存在,如何更新List。任何帮助将不胜感激

\renewcommand{\thepage}{\ifnum\value{page}<10 0\fi\arabic{page}}

3 个答案:

答案 0 :(得分:2)

试试termDictionary[<key>] = <value>。这将同时添加和更新(它将防止重复的密钥异常(可能只是覆盖现有数据)。

答案 1 :(得分:1)

您可以使用AddOrUpdate

从概念上讲,AddOrUpdate方法将始终导致集合中的值更改。

这些方法的目的是解决并发系统中时间性质的问题。对于多个线程,您无法预测在任何执行点都会在集合中找到哪些元素。

这是MSDN示例

class CD_GetOrAddOrUpdate
{
    // Demonstrates:
    //      ConcurrentDictionary<TKey, TValue>.AddOrUpdate()
    //      ConcurrentDictionary<TKey, TValue>.GetOrAdd()
    //      ConcurrentDictionary<TKey, TValue>[]
    static void Main()
    {
        // Construct a ConcurrentDictionary
        ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();

        // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
        Parallel.For(0, 10000, i =>
        {
            // Initial call will set cd[1] = 1.  
            // Ensuing calls will set cd[1] = cd[1] + 1
            cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
        });

        Console.WriteLine("After 10000 AddOrUpdates, cd[1] = {0}, should be 10000", cd[1]);

        // Should return 100, as key 2 is not yet in the dictionary
        int value = cd.GetOrAdd(2, (key) => 100);
        Console.WriteLine("After initial GetOrAdd, cd[2] = {0} (should be 100)", value);

        // Should return 100, as key 2 is already set to that value
        value = cd.GetOrAdd(2, 10000);
        Console.WriteLine("After second GetOrAdd, cd[2] = {0} (should be 100)", value);
    }
}

答案 2 :(得分:0)

ConcurrentDictionary GetOrAdd方法获取工厂委托:

var list = termDictionary.GetOrAdd(term, t=>new List<Artifact>());
list.Add(artifact);