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?

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top