0

我正在使用 Visual Studio 2010 C++ Express 并且我想向我的 ConcurrentDictionary 添加一个项目:

我有这样的代码:

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

AddOrUpdate 方法需要 3 个参数,不像普通的字典 2。

微软网站说它需要这样的论点:

public:
TValue AddOrUpdate(
TKey key, 
TValue addValue, 
Func<TKey, TValue, TValue>^ updateValueFactory
)

在微软网站上,我还发现了 C# 中的代码:

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

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

4

1 回答 1

0

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

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[](索引器,使用方括号):添加一个值,或者用一个常量值替换现有值。

如果您想要的只是一个简单的“添加”,那么它可能就是您感兴趣的方括号。

cd["foo"] = 1;
于 2012-07-27T17:45:35.407 回答