Intenté comprobar si era nulo, pero el compilador advierte que esta condición nunca ocurrirá. ¿Qué debería estar buscando?
Intenté comprobar si era nulo, pero el compilador advierte que esta condición nunca ocurrirá. ¿Qué debería estar buscando?
Respuestas:
Suponiendo que se desea obtener el valor si la tecla hace existir, su uso 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 ContainsKeyy luego el indexador hace que busque la clave dos veces, lo cual es bastante inútil).
Tenga en cuenta que incluso si estuviera usando tipos de referencia, la verificación de nulos no funcionaría: el indexador Dictionary<,>generará una excepción si solicita una clave que falta, en lugar de devolver un valor nulo. (Esta es una gran diferencia entre Dictionary<,>y Hashtable.)
ContainsKey, lo cual es cierto, porque también tiene que extraer el valor. Sin embargo, no está haciendo dos búsquedas.
El Diccionario lanza una KeyNotFoundexcepción en caso de que el diccionario no contenga su clave.
Como se sugiere, ContainsKeyes la precaución adecuada. TryGetValuetambién es eficaz.
Esto permite que el diccionario almacene un valor nulo de manera más efectiva. Sin que se comporte de esta manera, la verificación de un resultado nulo del operador [] indicaría un valor nulo O la inexistencia de la clave de entrada, lo cual no es bueno.
Si solo está verificando antes de intentar agregar un nuevo valor, use el ContainsKeymétodo:
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
}
Si está comprobando que existe el valor, use el TryGetValuemétodo como se describe en la respuesta de Jon Skeet.
GetValueElseAddmétodos a los que le da un valor (o a Func<TValue>) para guardar también la resolución en el Insertar si va a agregar si no está allí. Supongo que la razón por la que no se ha incluido en las bibliotecas de .NET es porque la ruta Add es menos frecuente si la estás usando en un estilo de caché]
TryGetValuesería mejor, pero si desea verificar si el diccionario contiene la clave para evitar adiciones duplicadas, diría que ContainsKeyes igual de bueno (si no mejor).
Debe buscar Dictionary.ContainsKey (clave int) antes de intentar extraer el 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. Afortunadamente, lo hago ahora, así que lo sabré en el futuro. Dejaré esta respuesta intacta, aunque la discusión es valiosa.
TryGetValueen una expresión lambda. Aunque eso me hace pensar que una nueva extensión de C # sería un catchoperador similar al nulloperador de fusión.
Una clase de ayudante es ú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 es lo que estás buscando.
Probablemente deberías usar:
if(myDictionary.ContainsKey(someInt))
{
// do something
}
La razón por la que no puede verificar si es nulo es que la clave aquí es un tipo de valor.
int result= YourDictionaryName.TryGetValue(key, out int value) ? YourDictionaryName[key] : 0;
Si la clave está presente en el diccionario, devuelve el valor de la clave; de lo contrario, devuelve 0.
Espero que este código te ayude.
TryGetValuees suficiente, use en valuelugar deresult
Considere la opción de encapsular este diccionario en particular y proporcione un método para devolver el valor de esa clave:
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;
}
}
Entonces puede administrar el comportamiento de este diccionario.
Por ejemplo aquí: si el diccionario no tiene la clave, devuelve la clave que pasas por parámetro.