2009-03-03 17 views
50

Estoy usando un diccionario para realizar búsquedas para un programa en el que estoy trabajando. Ejecuto un montón de claves en el diccionario, y espero que algunas claves no tengan ningún valor. Cojo el KeyNotFoundException justo donde ocurre y lo absorbo. Todas las demás excepciones se propagarán a la parte superior. ¿Es esta la mejor manera de manejar esto? ¿O debería usar una búsqueda diferente? El diccionario usa un int como su clave y una clase personalizada como su valor.La mejor manera de manejar una KeyNotFoundException

Respuesta

88

Uso Dictionary.TryGetValue lugar:

Dictionary<int,string> dictionary = new Dictionary<int,string>(); 
int key = 0; 
dictionary[key] = "Yes"; 

string value; 
if (dictionary.TryGetValue(key, out value)) 
{ 
    Console.WriteLine("Fetched value: {0}", value); 
} 
else 
{ 
    Console.WriteLine("No such key: {0}", key); 
} 
+1

nice answer thanks –

+0

¿Todavía se aconseja esto en lugar de ContainsKey()? –

+0

@SvenB: Sí, yo diría que sí. ¿Por qué realizar la búsqueda dos veces, una para verificar la existencia de la clave y otra para obtener el valor, cuando puede hacer ambas cosas al mismo tiempo? –

31

Trate de usar: Dict.ContainsKey

Editar:
En cuanto al rendimiento creo que es mejor Dictionary.TryGetValue como algunos otros sugirieron, pero no me gusta usar cuando yo no tengo que lo que en mi opinión ContainsKey es más legible pero requiere más líneas de código si necesita el valor también.

+0

¿Por qué obtuvo un voto a favor? por favor explique para que pueda mejorar la respuesta. – Peter

+0

¿Podría explicar por qué no le gusta usar 'out' a menos que sea necesario? –

+1

@wilbishard es solo un hábito, en mi opinión, creo que es más difícil pasar por alto que un parámetro de método se puede modificar es mucho más claro cuando se tiene un signo =. ahora esta es solo mi opinión y eso no significa que todos sientan lo mismo, y en algunos casos es la mejor opción 'int.TryParse' es un ejemplo .. – Peter

4

se debe utilizar el método del diccionario 'ContainsKey (clave de cadena)' para comprobar si existe una clave. usando excepciones para el flujo normal del programa no se considera una buena práctica.

+2

Exactamente por qué hice esta pregunta, sentí que lo que estaba haciendo no era una buena práctica. –

11

Aquí es una sola solución elegante, línea (Tenga en cuenta que esto hace que la búsqueda dos veces. Véase más abajo para la versión TryGetValue de este que debe ser usado en circuitos de larga duración.)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default"; 

Sin embargo, yo me encuentro teniendo que hacer esto cada vez que accedo a un diccionario. Yo preferiría que volver nula por lo que sólo se puede escribir:

string value = dictionary[key] ?? "default";//this doesn't work 
+0

Evite usar esta solución ya que requiere dos búsquedas en el diccionario. Una búsqueda para 'dictionary.ContainsKey' y otra para' dictionary [key] '. Use la respuesta de @JernejNovak para un mejor rendimiento. – FrankerZ

+0

A veces, el rendimiento no es una prioridad y la legibilidad es más importante. La respuesta de Jon Skeet no es algo que quieras diseminar por todo tu código. Yo diría evitar esto en los bucles grandes. Haré una nota en mi respuesta. Sin embargo, en realidad no vale la pena el downvote. –

+0

¿Cómo es 'string value = dictionary.ContainsKey (clave)? dictionary [key]: "default"; 'más legible que' string value = dictionary.TryGetValue (clave, valor de salida)? valor: "¡Sin clave!"; " – FrankerZ

14

Una solución línea utilizando TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!"; 

Sé consciente de que valor variable debe ser del tipo de diccionario que vuelve en este caso cuerdas. Aquí no puede usar var para declaración de variable.

Cuestiones relacionadas