Como iterar sobre todos os valores de Enum em C#: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como iterar sobre todos os valores de Enum em C#: do iniciante ao profissional

\n\n

Imagine 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.

\n\n

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\n

Vamos lá!

\n\n
\n\n

O que é Enum em C# e por que iterar sobre ele?

\n\n

Enum (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.

\n\n

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
\n\n

Em vez de escrever:

\n
string[] 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\n

Esta é 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.

\n\n

Exemplo de código:

\n
using 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\n

Saída no console:

\n
Todos 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\n

Importante: 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.

\n\n
// .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.

\n\n

Exemplo:

\n
string[] names = Enum.GetNames(typeof(Difficulty));\nConsole.WriteLine("Nomes dos níveis:");\nforeach (string name in names)\n{\n    Console.WriteLine(name);\n}
\n\n

Saída:

\n
Nomes dos níveis:\nEasy\nNormal\nHard\nInsane
\n\n

Quando 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.

Blogs

Book Recommendations