Cómo iterar sobre todos los valores de Enum en C#: de principiante a profesional
\n\nImagina esta situación: estás escribiendo un juego en C# y tienes una enumeración Difficulty con niveles de dificultad: Easy, Normal, Hard, Insane. Necesitas mostrarlos todos en un menú de selección, o, digamos, crear una lista desplegable para un configurador. ¿Cómo hacerlo? ¿Escribir manualmente un array de strings? ¿Y si mañana se agrega un nuevo nivel? Tendrías que meterte en el código y cambiarlo en tres lugares.
Afortunadamente, en C# hay una solución elegante. La pregunta "How to loop through all enum values in C#?" es una de las más populares en Stack Overflow (cientos de miles de visitas). Y hoy la analizaremos por completo. Aprenderás no una, sino 4 formas de iterar sobre valores enum, entenderás cuándo usar cada una y obtendrás código listo para copiar en tu proyecto.
\n\n¡Allá vamos!
\n\n\n\n
¿Qué es Enum en C# y por qué iterar sobre él?
\n\nEnum (enumeración) es un conjunto de constantes con nombre. En lugar de recordar que 0 = Easy, 1 = Normal, 2 = Hard, simplemente escribes Difficulty.Easy. El código se vuelve legible y seguro.
Pero cuando en un proyecto hay 10-20 valores enum, tarde o temprano surge la tarea: obtenerlos todos. Por ejemplo:
\n- \n
- Rellenar un ComboBox o Dropdown en la interfaz de usuario. \n
- Crear datos de prueba para todas las variantes. \n
- Aplicar atributos a cada valor. \n
- Comparar dos conjuntos enum. \n
En lugar de escribir:
\nstring[] names = { "Easy", "Normal", "Hard", "Insane" };\n\n…usamos reflexión y métodos integrados de .NET. Es flexible, escalable y no requiere actualización manual.
\n\n\n\n
Forma 1: La clásica — Enum.GetValues (la más popular)
\n\nEsta es la respuesta que encontrarás en Stack Overflow con más votos. El método Enum.GetValues(typeof(YourEnum)) devuelve un array con todos los valores de una enumeración específica.
Ejemplo de código:
\nusing System;\n\npublic enum Difficulty\n{\n Easy,\n Normal,\n Hard,\n Insane\n}\n\nclass Program\n{\n static void Main()\n {\n Console.WriteLine("Todos los niveles de dificultad:");\n \n // Obtenemos el array de valores del enum\n Difficulty[] allDifficulties = (Difficulty[])Enum.GetValues(typeof(Difficulty));\n \n foreach (Difficulty level in allDifficulties)\n {\n Console.WriteLine($"Nivel: {level} (valor numérico: {(int)level})");\n }\n }\n}\n\nSalida en consola:
\nTodos los niveles de dificultad:\nNivel: Easy (valor numérico: 0)\nNivel: Normal (valor numérico: 1)\nNivel: Hard (valor numérico: 2)\nNivel: Insane (valor numérico: 3)\n\nImportante: Enum.GetValues devuelve un array de tipo Array, por lo que debes convertirlo explícitamente a tu tipo enum. A partir de .NET 5, apareció la versión genérica: Enum.GetValues<Difficulty>(), que es un poco más cómoda.
// .NET 5+ \nDifficulty[] allDifficulties = Enum.GetValues<Difficulty>();\nforeach (var level in allDifficulties)\n{\n Console.WriteLine(level);\n}\n\n\n\n
Forma 2: Obtener nombres mediante Enum.GetNames
\n\nA veces necesitas no los valores en sí, sino sus nombres como strings (por ejemplo, para la interfaz de usuario). Para eso está Enum.GetNames. Devuelve un array de strings.
Ejemplo:
\nstring[] names = Enum.GetNames(typeof(Difficulty));\nConsole.WriteLine("Nombres de los niveles:");\nforeach (string name in names)\n{\n Console.WriteLine(name);\n}\n\nSalida:
\nNombres de los niveles:\nEasy\nNormal\nHard\nInsane\n\n¿Cuándo usarlo? Cuando necesites específicamente strings (por ejemplo, para mostrarlos en la interfaz o para registro), y no las constantes enum en sí.