Avatar ·

Как перечислить все значения перечисления (enum) в C#?

Всем привет! Я только начал изучать C# и столкнулся с такой проблемой. У меня есть перечисление, например: ```csharp enum DaysOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } ``` Мне нужно вывести все дни недели в консоль или использовать их в цикле. Я понимаю, как работать с массивами и списками, но с enum я запутался. Пробовал написать что-то вроде: ```csharp foreach (var day in DaysOfWeek) { Console.WriteLine(day); } ``` Но компилятор выдаёт ошибку: "foreach cannot operate on a 'type'". Я погуглил, пишут, что нужно использовать `Enum.GetValues`, но я не до конца понимаю, как это работает. Подскажите, пожалуйста, как правильно перебрать все значения enum? И можно ли как-то получить их количество? Буду благодарен за примеры кода. Заранее спасибо! <<>>

Использование 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>().