Tentei verificar se há nulo, mas o compilador avisa que essa condição nunca ocorrerá. O que devo procurar?
Tentei verificar se há nulo, mas o compilador avisa que essa condição nunca ocorrerá. O que devo procurar?
Respostas:
Supondo que você deseja obter o valor se a chave não existir, use Dictionary<TKey, TValue>.TryGetValue
:
int value;
if (dictionary.TryGetValue(key, out value))
{
// Key was in dictionary; "value" contains corresponding value
}
else
{
// Key wasn't in dictionary; "value" is now 0
}
(Usar ContainsKey
e, em seguida, o indexador faz com que ele procure a chave duas vezes, o que é bastante inútil.)
Observe que mesmo se você estivesse usando tipos de referência, a verificação de null não funcionaria - o indexador de Dictionary<,>
lançará uma exceção se você solicitar uma chave ausente, em vez de retornar null. (Esta é uma grande diferença entre Dictionary<,>
e Hashtable
.)
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.
Se você está apenas verificando antes de tentar adicionar um novo valor, use o ContainsKey
método:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Se você está verificando se o valor existe, use o TryGetValue
método descrito na resposta de Jon Skeet.
GetValueElseAdd
métodos para os quais você fornece um valor (ou a Func<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 que ContainsKey
é tão bom (se não melhor).
Você deve verificar Dictionary.ContainsKey (int key) antes de tentar extrair o valor.
Dictionary<int, int> myDictionary = new Dictionary<int, int>();
myDictionary.Add(2,4);
myDictionary.Add(3,5);
int keyToFind = 7;
if(myDictionary.ContainsKey(keyToFind))
{
myValueLookup = myDictionay[keyToFind];
// do work...
}
else
{
// the key doesn't exist.
}
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 um catch
operador semelhante ao null
operador coalescente.
Uma classe auxiliar é útil:
public static class DictionaryHelper
{
public static TVal Get<TKey, TVal>(this Dictionary<TKey, TVal> dictionary, TKey key, TVal defaultVal = default(TVal))
{
TVal val;
if( dictionary.TryGetValue(key, out val) )
{
return val;
}
return defaultVal;
}
}
ContainsKey é o que você está procurando.
Você provavelmente deve usar:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
O motivo pelo qual você não pode verificar se há nulo é que a chave aqui é um tipo de valor.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
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ê.
TryGetValue
é o suficiente, use em value
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:
public static class NumbersAdapter
{
private static readonly Dictionary<string, string> Mapping = new Dictionary<string, string>
{
["1"] = "One",
["2"] = "Two",
["3"] = "Three"
};
public static string GetValue(string key)
{
return Mapping.ContainsKey(key) ? Mapping[key] : key;
}
}
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.