How to enumerate C# enum

Enums are widely used in C# language.

And there are 4 ways to enumerate enum in C#.

  1. Using C# Enum.GetValues() in .Net 5 & above.
  2. Using C# Enum.GetValues() in older .Net versions.
  3. Using C# Enum.GetNames() to enumerate enum names as strings.
  4. Using Linq

Let’s go through an example to understand it further.

First we will create a C# enum

public enum LogLevel
{
   ERROR, 
   WARN, 
   INFO, 
   DEBUG
}

The enum represents different types of logging levels.

Now we will see different ways to enumerate the C# enum.

Using C# Enum.GetValues() Generic method in .Net 5 & above

If you are using latest version of .Net , i.e., .Net 5 and above you can use generic version for the Enum.GetValues method to enumerate the C# enum.

void loopEnum()
{
   LogLevel[] logLevels = Enum.GetValues<LogLevel>();
   
   foreach (LogLevel logLevel in logLevels)
   {
        Console.WriteLine(logLevel.ToString());
   }
}

The new generic version of Enum.GetValues returns the array of enum values.

And further we can use for or foreach statements to list the C# enum names.

As the array contains the enum type we need to convert it to the string using ToString() method.

Using C# Enum.GetValues() in older .Net versions.

In the older versions of .Net there is no generic method available for Enum.GetValues() method.

You need to pass typeof() enum as a parameter to Enum.GetValues() method.

Array logLevels = Enum.GetValues(typeof(LogLevel))

And it returns enum values of type System.Array and further we can use foreach statement to loop through the C# enum names.

void loopEnum()
{
   Array logLevels = Enum.GetValues(typeof(LogLevel))
   foreach (LogLevel logLevel in logLevels)
   {
        Console.WriteLine(logLevel.ToString());
   }
}

If you want IEnumerable result, we can further cast the Enum.GetValues() method.

void loopEnum()
{
   var logLevels = Enum.GetValues(typeof(LogLevel)).Cast<LogLevel>();
   foreach (LogLevel logLevel in logLevels)
   {
        Console.WriteLine(logLevel.ToString());
   }
}

Using C# Enum.GetNames() to enumerate enum names as strings

C# Enum.GetValues() method returns array of enum types.

That’s why we converted enum names to string before printing them in the console.

Using C# Enum.GetNames() method we can enumerate enum names as strings, so that it’s not required to convert them to strings.

If you are using .Net 5 & above, You can use generic C# Enum.GetNames() function.

void loopEnum()
{
   string[] logLevels = Enum.GetNames<LogLevel>();
   
   foreach (string logLevel in logLevels)
   {
        Console.WriteLine(logLevel);
   }
}

In the older versions we need to pass typeof() enum parameter.

void loopEnum()
{
   string[] logLevels = Enum.GetNames(typeof(LogLevel));
   foreach (string logLevel in logLevels)
   {
        Console.WriteLine(logLevel);
   }
}

So If you want to en enumerate names as strings we can use C# Enum.GetNames() method.

Using Linq

We can use Linq forEach method to enumerate C# enum, with the help of Enum.GetValues() and Enum.GetNames() methods.

In .Net 5 and above use the below code snippet.

//Using Enum.GetValues
Enum.GetValues<LogLevel>()
        .ToList()
        .ForEach(loglevel => Console.WriteLine(loglevel.ToString()));

//Using Enum.GetNames
Enum.GetNames<LogLevel>()
        .ToList()
        .ForEach(loglevel => Console.WriteLine(loglevel));        

In the older versions

//Using Enum.GetValues
Enum.GetValues(typeof(LogLevel))
    .Cast<LogLevel>().ToList()
    .ForEach(loglevel => Console.WriteLine(loglevel.ToString()));

//Using Enum.GetNames
Enum.GetNames(typeof(LogLevel))
    .ToList()
    .ForEach(loglevel => Console.WriteLine(loglevel));    

Summary

In this tutorial we learnt to enumerate enum in C# using Enum.GetValues() and Enum.GetNames() method.