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
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);
}
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.
¿Por qué obtuvo un voto a favor? por favor explique para que pueda mejorar la respuesta. – Peter
¿Podría explicar por qué no le gusta usar 'out' a menos que sea necesario? –
@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
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.
Exactamente por qué hice esta pregunta, sentí que lo que estaba haciendo no era una buena práctica. –
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
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
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. –
¿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
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.
- 1. ¿Una mejor manera de manejar la bifurcación y la fusión?
- 2. mejor manera de manejar múltiples NSTableView (s)
- 3. KeyNotFoundException info
- 4. Una mejor manera de manejar NullReferenceExceptions en C#
- 5. La mejor manera de manejar los mensajes de error
- 6. ¿Cuál es la mejor manera de manejar objects.get de Django?
- 7. ¿La mejor manera de manejar múltiples UITableViews en un UIViewController?
- 8. ¿Cuál es la mejor manera de manejar FBO en OpenGL?
- 9. ¿Cuál es la mejor manera de manejar excepciones en Perl?
- 10. ¿Cuál es la mejor manera de manejar múltiples acciones?
- 11. La mejor manera de manejar cadenas enormes en C#
- 12. ¿Cuál es la mejor manera de manejar buffers grandes en una pila de protocolos en capas?
- 13. La mejor manera de manejar CSS dinámico en una aplicación de rieles
- 14. Necesita una mejor manera que la Reflexión
- 15. ¿La mejor manera de planificar una tarea?
- 16. La mejor manera de ordenar una matriz
- 17. ¿La mejor manera de iniciar una descarga?
- 18. La mejor manera de manejar la autenticación de cuenta de usuario y las contraseñas
- 19. La mejor manera de manejar la simultaneidad con el marco de entidades
- 20. ¿La mejor manera de manejar la asignación de memoria en C?
- 21. T-SQL: la mejor manera de manejar valores NULL en la concatenación de cadenas
- 22. Rieles: ¿Manera elegante de manejar la navegación?
- 23. La mejor manera de manejar la entrada desde un teclado "cuña"
- 24. La mejor manera de comprimir XML
- 25. La mejor manera de hacer hooks PHP
- 26. La mejor manera de manejar la residencia múltiple en Rails 3
- 27. La mejor manera de manejar la autenticación en .NET WCF Web API
- 28. ¿La mejor manera de manejar múltiples instancias de archivos de configuración?
- 29. ¿Cuál es la mejor manera de manejar ramas de sucursales de proveedores en SVN?
- 30. ¿Cuál es la mejor manera de manejar entradas de dirección que pueden ser de varios países?
nice answer thanks –
¿Todavía se aconseja esto en lugar de ContainsKey()? –
@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? –