ConcurrentDictionary-> VS C ++中的AddOrUpdate

时间:2012-07-27 16:31:14

标签: visual-studio-2010 c++-cli concurrentdictionary

我使用的是Visual Studio 2010 C ++ Express,我想在ConcurrentDictionary中添加一个项目:

我有这样的代码:

String^ key = gcnew String("key");
int value = 123;
myDictionary->AddOrUpdate(key,value,/*WHAT TO ADD HERE?*/);

AddOrUpdate Method需要3个参数,而不是普通的Dictionary 2。

微软网站表示需要这样的论据:

public:
TValue AddOrUpdate(
TKey key, 
TValue addValue, 
Func<TKey, TValue, TValue>^ updateValueFactory
)
在微软网站上我也找到了C#中的代码:

cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);

但它在C ++中不起作用。我必须把它作为第三个论点?

1 个答案:

答案 0 :(得分:0)

第三个参数是委托,在您找到的C#示例代码中是一个lambda。但是,C ++ / CLI不支持lambdas,因此您必须使用独立方法。

static int UpdateFunc(String^ key, int value)
{
    return value + 1;
}

cd->AddOrUpdate("foo", 1, gcnew Func<String^, int, int>(MyClass::UpdateFunc));

但是,你说“我想在ConcurrentDictionary中添加一个项目”。没有简单的“添加”方法,因为其他线程可能总是修改了ConcurrentDictionary。因此,如何将内容放入字典中有几种选择。

  • AddOrUpdate:添加值,或修改现有值(如果该键已存在)。 (将当前值传递给委托,该委托返回修改。)
  • GetOrAdd:添加值,或者如果该键已存在则检索现有值。 (如果密钥已存在,则不修改字典。)
  • this [](Indexer,使用方括号):添加值,或用常量值替换现有值。

如果你想要的只是一个简单的'添加',它可能是你感兴趣的方括号。

cd["foo"] = 1;