Как перечислить все значения перечисления (enum) в C#?
Использование Enum.GetValues для перебора значений перечисления
В C# нет встроенной возможности перебирать перечисление напрямую через foreach, потому что enum — это не коллекция, а тип данных. Однако для этой задачи существует статический метод Enum.GetValues, который возвращает массив всех значений указанного перечисления.
Базовый пример
enum DaysOfWeek
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
}
// Перебор всех значений
foreach (DaysOfWeek day in Enum.GetValues(typeof(DaysOfWeek)))
{
Console.WriteLine(day);
}
Вывод:
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Как это работает
typeof(DaysOfWeek)— получает объектTypeдля вашего перечисления.Enum.GetValues()— возвращает массив объектов типаArray, который содержит все значения перечисления.- В
foreachмы явно указываем типDaysOfWeek, чтобы получить значения в нужном формате.
Получение количества значений
Чтобы узнать, сколько элементов содержит перечисление, используйте свойство Length полученного массива:
int count = Enum.GetValues(typeof(DaysOfWeek)).Length;
Console.WriteLine($"Всего дней: {count}"); // Вывод: Всего дней: 7
Работа с именами и числовыми значениями
Если вам нужно получить строковые имена или базовые числовые значения:
foreach (DaysOfWeek day in Enum.GetValues(typeof(DaysOfWeek)))
{
// Имя элемента
string name = day.ToString();
// Числовое значение (по умолчанию int)
int numericValue = (int)day;
Console.WriteLine($"{name} = {numericValue}");
}
Вывод:
Monday = 0
Tuesday = 1
Wednesday = 2
Thursday = 3
Friday = 4
Saturday = 5
Sunday = 6
Современный синтаксис (C# 7.3 и выше)
Начиная с C# 7.3, можно использовать обобщённую версию Enum.GetValues<T>(), которая сразу возвращает массив нужного типа:
foreach (DaysOfWeek day in Enum.GetValues<DaysOfWeek>())
{
Console.WriteLine(day);
}
Этот вариант короче и безопаснее с точки зрения типов.
Важные замечания
Enum.GetValuesвозвращает значения в порядке их объявления в коде, а не по числовому значению.- Если перечисление помечено атрибутом
[Flags], метод всё равно вернёт все отдельные флаги, но не их комбинации. - Для производительности в циклах можно сохранить результат в локальную переменную, чтобы не вызывать метод повторно.
Пример с обработкой
var allDays = Enum.GetValues<DaysOfWeek>();
foreach (var day in allDays)
{
if (day == DaysOfWeek.Saturday || day == DaysOfWeek.Sunday)
Console.WriteLine($"{day} — выходной");
else
Console.WriteLine($"{day} — рабочий день");
}
<<Альтернативный подход: использование Enum.GetNames
Если вам нужны только строковые имена значений перечисления (без числовых эквивалентов), используйте метод Enum.GetNames. Он возвращает массив строк:
string[] dayNames = Enum.GetNames(typeof(DaysOfWeek));
foreach (string name in dayNames)
{
Console.WriteLine(name);
}
Этот метод удобен, когда вам нужно вывести названия в пользовательский интерфейс или сохранить их в базу данных.
Комбинирование с Enum.Parse
Если после получения имён вам нужно восстановить исходное значение перечисления, используйте Enum.Parse:
string[] names = Enum.GetNames(typeof(DaysOfWeek));
foreach (string name in names)
{
DaysOfWeek day = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), name);
Console.WriteLine($"{name} = {(int)day}");
}
Когда использовать
Enum.GetValues— когда нужны сами значения перечисления (для switch, сравнений, арифметики).Enum.GetNames— когда нужны только строки (вывод, логирование, сериализация).
Оба метода работают быстро и подходят для большинства задач. Для современных версий C# рекомендую обобщённые версии: Enum.GetValues<T>() и Enum.GetNames<T>().
Ответов пока нет.
Войдите чтобы оставить ответ