0

私は Visual Studio 2010 C++ Express を使用しており、ConcurrentDictionary に項目を追加する必要があります。

私はそのようなコードを持っています:

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

AddOrUpdate メソッドは、通常の Dictionary 2 とは異なり、3 つの引数を取ります。

Microsoft のサイトでは、次のような引数を取ると述べています。

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

マイクロソフトのサイトでは、C# のコードも見つけました。

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

ただし、C++ では機能しません。3番目の引数として何を入れなければなりませんか?

4

1 に答える 1

0

3 番目のパラメーターはデリゲートで、見つけた C# サンプル コードではラムダです。ただし、C++/CLI はラムダをサポートしていないため、スタンドアロン メソッドで実行する必要があります。

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 に答える