To convert an enum to a list in C#, you primarily use the Enum.GetValues
method to retrieve the values and optionally Enum.GetNames
for string representations. Here’s a detailed explanation with examples:
Key Concepts
Enum.GetValues(Type)
: Returns an array of all enum values (underlying integer values).Enum.GetNames(Type)
: Returns an array of enum member names (strings).- Casting: Convert values to the actual enum type.
- LINQ: Process results into lists or other collections.
Example 1: Basic Conversion to List of Enum Values
using System;
using System.Collections.Generic;
using System.Linq;
public enum Color
{
Red,
Green,
Blue
}
class Program
{
static void Main()
{
// Get all enum values as Color objects
List<Color> colorValues = Enum.GetValues(typeof(Color))
.Cast<Color>()
.ToList();
// Output: [Red, Green, Blue]
Console.WriteLine(string.Join(", ", colorValues));
}
}
Example 2: Get Enum Names as Strings
// Get enum member names as strings
List<string> colorNames = Enum.GetNames(typeof(Color)).ToList();
// Output: ["Red", "Green", "Blue"]
Console.WriteLine(string.Join(", ", colorNames));
Example 3: Get Values and Names Together
Combine names and values into a list of tuples or objects:
var colorData = Enum.GetValues(typeof(Color))
.Cast<Color>()
.Select(c => new { Name = c.ToString(), Value = (int)c })
.ToList();
foreach (var item in colorData)
{
Console.WriteLine($"Name: {item.Name}, Value: {item.Value}");
}
Output:
Name: Red, Value: 0
Name: Green, Value: 1
Name: Blue, Value: 2
Example 4: Handle Enums with Non-Contiguous Values
Works correctly even with explicit assignments:
public enum Status
{
Pending = 10,
Approved = 20,
Rejected = 30
}
List<Status> statusList = Enum.GetValues(typeof(Status))
.Cast<Status>()
.ToList();
// Output: [Pending, Approved, Rejected]
Explanation
Enum.GetValues(typeof(MyEnum))
Returns anArray
of underlying values (e.g., integers). Requires casting to the enum type..Cast<MyEnum>()
Converts the array toIEnumerable<MyEnum>
for LINQ operations..ToList()
Converts the result to aList<T>
.Enum.GetNames
Directly returns string names without requiring casting.
Common Errors & Fixes
- Compile Error:
Cast<T>
Missing
Addusing System.Linq;
. GetValues
Returns Integers
You must cast to the enum type:.Cast<YourEnum>()
.- Non-Default Underlying Type
Works the same (e.g.,enum Test : byte
still usesCast<Test>()
).
Alternative: Generic Helper Method
Create a reusable method for any enum:
public static class EnumExtensions
{
public static List<T> ToList<T>() where T : Enum
{
return Enum.GetValues(typeof(T)).Cast<T>().ToList();
}
}
// Usage:
List<Color> colors = EnumExtensions.ToList<Color>();
Which Method to Use?
- Use
Enum.GetValues().Cast<EnumType>().ToList()
for enum values. - Use
Enum.GetNames().ToList()
for string names. - Use LINQ projections for custom structures (e.g., tuples).
This approach ensures type safety and leverages built-in .NET enum handling.