Tentei verificar se há nulo, mas o compilador avisa que essa condição nunca ocorrerá. O que devo procurar?
c#
dictionary
Deltanovember
fonte
fonte
ContainsKey
, o que é verdade, porque também precisa extrair valor. Não está fazendo duas pesquisas embora.O Dicionário lança uma
KeyNotFound
exceção caso o dicionário não contenha sua chave.Como sugerido,
ContainsKey
é a precaução adequada.TryGetValue
também é eficaz.Isso permite que o dicionário armazene um valor nulo de forma mais eficaz. Sem ele se comportar dessa maneira, a verificação de um resultado nulo do operador [] indicaria um valor nulo OU a não existência da chave de entrada, o que não é bom.
fonte
Se você está apenas verificando antes de tentar adicionar um novo valor, use o
ContainsKey
método:Se você está verificando se o valor existe, use o
TryGetValue
método descrito na resposta de Jon Skeet.fonte
GetValueElseAdd
métodos para os quais você fornece um valor (ou aFunc<TValue>
) para também salvar a resolução no Insert se você for adicionar se não estiver lá. Eu acho que o motivo pelo qual não foi incluído nas bibliotecas .NET é porque o caminho Add é menos frequente se você o estiver usando em um estilo de cache]TryGetValue
seria melhor, mas se você quiser verificar se o dicionário contém a chave para evitar adições duplicadas, eu diria queContainsKey
é tão bom (se não melhor).Você deve verificar Dictionary.ContainsKey (int key) antes de tentar extrair o valor.
fonte
TryGetValue
. Felizmente, eu sei agora, então saberei no futuro. Vou deixar esta resposta intacta, embora porque a discussão seja valiosa.TryGetValue
em uma expressão lambda. Embora isso me faça pensar que uma nova extensão para C # seria umcatch
operador semelhante aonull
operador coalescente.Uma classe auxiliar é útil:
fonte
ContainsKey é o que você está procurando.
fonte
Você provavelmente deve usar:
O motivo pelo qual você não pode verificar se há nulo é que a chave aqui é um tipo de valor.
fonte
Se a chave estiver presente no dicionário, ele retorna o valor da chave, caso contrário, retorna 0.
Espero que este código ajude você.
fonte
TryGetValue
é o suficiente, use emvalue
vez deresult
Considere a opção de encapsular este dicionário específico e fornecer um método para retornar o valor para essa chave:
Então você pode gerenciar o comportamento deste dicionário.
Por exemplo aqui: se o dicionário não tem a chave, ele retorna a chave que você passa por parâmetro.
fonte