ConcurrentDictionary-> AddOrUpdate em VS C++
-
12-12-2019 - |
Pergunta
estou usando o Visual Studio 2010 C++ Express e desejo adicionar um item ao meu ConcurrentDictionary:
eu tenho esse código:
String^ key = gcnew String("key");
int value = 123;
myDictionary->AddOrUpdate(key,value,/*WHAT TO ADD HERE?*/);
O método AddOrUpdate leva 3 argumentos, diferente do Dicionário 2 normal.
Os sites da Microsoft dizem que são necessários os seguintes argumentos:
public:
TValue AddOrUpdate(
TKey key,
TValue addValue,
Func<TKey, TValue, TValue>^ updateValueFactory
)
em sites da Microsoft também encontrei código em C#:
cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
mas não funciona em C++.o que devo colocar como terceiro argumento?
Solução
O terceiro parâmetro é um delegado, que no código de exemplo C# encontrado é um lambda.No entanto, C++/CLI não suporta lambdas, então você teria que fazer isso com um método independente.
static int UpdateFunc(String^ key, int value)
{
return value + 1;
}
cd->AddOrUpdate("foo", 1, gcnew Func<String^, int, int>(MyClass::UpdateFunc));
No entanto, você disse "Quero adicionar um item ao meu ConcurrentDictionary".Não existe um método "add" simples, porque é sempre o caso de outro thread ter modificado o ConcurrentDictionary.Portanto, existem algumas opções de como colocar coisas no dicionário.
- Adicionar ou atualizar:Adicione um valor ou modifique um valor existente se essa chave já existir.(Passa o valor atual para um delegado, que retorna a modificação.)
- Obter ou adicionar:Adicione um valor ou recupere o valor existente se essa chave já existir.(Não modifica o dicionário se a chave já existir.)
- this[] (Indexador, usa colchetes):Adicione um valor ou substitua o valor existente por um valor constante.
Se tudo o que você deseja é uma simples adição, provavelmente são os colchetes que lhe interessam.
cd["foo"] = 1;