Como iterar sobre todos os valores de Enum em C#: do iniciante ao profissional
\n\nImagine a situação: você está escrevendo um jogo em C# e tem uma enumeração Difficulty com níveis de dificuldade: Easy, Normal, Hard, Insane. Você precisa exibi-los todos em um menu de seleção, ou, digamos, criar uma lista suspensa para um configurador. Como fazer? Escrever um array de strings manualmente? E se amanhã um novo nível for adicionado? Você terá que mexer no código e alterá-lo em três lugares.
Felizmente, em C# existe uma solução elegante. A pergunta "How to loop through all enum values in C#?" é uma das mais populares no Stack Overflow (centenas de milhares de visualizações). E hoje vamos abordá-la completamente. Você aprenderá não apenas uma, mas 4 maneiras de iterar sobre valores de enum, entenderá qual usar em cada situação e terá código pronto para copiar para o seu projeto.
\n\nVamos lá!
\n\n\n\n
O que é Enum em C# e por que iterar sobre ele?
\n\nEnum (enumeração) é um conjunto de constantes nomeadas. Em vez de lembrar que 0 = Easy, 1 = Normal, 2 = Hard, você escreve simplesmente Difficulty.Easy. O código se torna legível e seguro.
Mas quando o projeto tem 10-20 valores de enum, mais cedo ou mais tarde surge a tarefa: obter todos eles. Por exemplo:
\n- \n
- Preencher um ComboBox ou Dropdown na interface do usuário. \n
- Criar dados de teste para todas as variações. \n
- Aplicar atributos a cada valor. \n
- Comparar dois conjuntos de enum. \n
Em vez de escrever:
\nstring[] names = { "Easy", "Normal", "Hard", "Insane" };\n\n…usamos reflexão e métodos embutidos do .NET. Isso é flexível, escalável e não requer atualização manual.
\n\n\n\n
Maneira 1: Clássico — Enum.GetValues (o mais popular)
\n\nEsta é a resposta que você encontrará no Stack Overflow com o maior número de votos. O método Enum.GetValues(typeof(YourEnum)) retorna um array de todos os valores de uma enumeração específica.
Exemplo 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 os níveis de dificuldade:");\n \n // Obtém o array de valores do enum\n Difficulty[] allDifficulties = (Difficulty[])Enum.GetValues(typeof(Difficulty));\n \n foreach (Difficulty level in allDifficulties)\n {\n Console.WriteLine($"Nível: {level} (valor numérico: {(int)level})");\n }\n }\n}\n\nSaída no console:
\nTodos os níveis de dificuldade:\nNível: Easy (valor numérico: 0)\nNível: Normal (valor numérico: 1)\nNível: Hard (valor numérico: 2)\nNível: Insane (valor numérico: 3)\n\nImportante: Enum.GetValues retorna um array do tipo Array, portanto, é necessário convertê-lo explicitamente para o seu tipo de enum. A partir do .NET 5, surgiu a versão genérica: Enum.GetValues<Difficulty>(), que é um pouco mais conveniente.
// .NET 5+ \nDifficulty[] allDifficulties = Enum.GetValues<Difficulty>();\nforeach (var level in allDifficulties)\n{\n Console.WriteLine(level);\n}\n\n\n\n
Maneira 2: Obtendo os nomes com Enum.GetNames
\n\nÀs vezes você precisa não dos valores em si, mas de seus nomes em string (por exemplo, para a interface do usuário). Para isso, existe Enum.GetNames. Ele retorna um array de strings.
Exemplo:
\nstring[] names = Enum.GetNames(typeof(Difficulty));\nConsole.WriteLine("Nomes dos níveis:");\nforeach (string name in names)\n{\n Console.WriteLine(name);\n}\n\nSaída:
\nNomes dos níveis:\nEasy\nNormal\nHard\nInsane\n\nQuando usar? Se você precisa exatamente das strings (por exemplo, para exibição na interface ou registro de log), e não das constantes enum em si.