【问题标题】:ConcurrentDictionary->AddOrUpdate in VS C++VS C++ 中的 ConcurrentDictionary->AddOrUpdate
【发布时间】:2012-07-27 16:31:13
【问题描述】:

我正在使用 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++ 中不起作用。我必须把什么作为第三个参数?

【问题讨论】:

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


    【解决方案1】:

    第三个参数是一个委托,在您找到的 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多