Avatar ·

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

Всем привет! Я начинающий C# разработчик, и у меня возникла проблема с перечислениями. У меня есть такое перечисление: ```csharp public enum Colors { Red, Green, Blue, Yellow } ``` Мне нужно получить список всех значений этого перечисления в виде `List`, чтобы я мог, например, заполнить выпадающий список (ComboBox) или просто перебрать все варианты в цикле. Я пытался сделать что-то вроде `Colors.ToList()`, но компилятор выдаёт ошибку. Также пробовал `Enum.GetValues(typeof(Colors))`, но это возвращает массив, а не список. Мне нужно именно `List`. Подскажите, как правильно конвертировать перечисление в список? И можно ли сразу получить список строковых представлений (например, "Red", "Green")? Буду благодарен за простой и понятный пример. <<>>

Преобразование enum в список значений

В C# нет прямого метода .ToList() для перечислений, но задача решается очень просто с помощью комбинации методов Enum.GetValues() и LINQ. Основная идея: получить массив всех значений через Enum.GetValues(), а затем преобразовать его в список с помощью .ToList().

Вот самый распространённый и правильный способ:

using System;
using System.Linq;
using System.Collections.Generic;

public enum Colors
{
    Red,
    Green,
    Blue,
    Yellow
}

class Program
{
    static void Main()
    {
        // Получаем список значений enum
        List<Colors> colorsList = Enum.GetValues(typeof(Colors))
                                       .Cast<Colors>()
                                       .ToList();
        
        // Выводим результат
        foreach (var color in colorsList)
        {
            Console.WriteLine(color); // Red, Green, Blue, Yellow
        }
    }
}

Разбор по шагам:

  • Enum.GetValues(typeof(Colors)) — возвращает массив Array со всеми значениями перечисления.
  • .Cast<Colors>() — преобразует элементы массива в тип Colors (так как GetValues возвращает нетипизированный массив).
  • .ToList() — создаёт из последовательности список List<Colors>.

Обязательно подключите пространства имён System.Linq и System.Collections.Generic в начале файла.

Как получить список строковых названий?

Если вам нужен список строк (например, для ComboBox), используйте Enum.GetNames():

List<string> colorNames = Enum.GetNames(typeof(Colors)).ToList();

// Результат: ["Red", "Green", "Blue", "Yellow"]

Или можно получить список строк из значений, используя ToString():

List<string> colorNames2 = Enum.GetValues(typeof(Colors))
                               .Cast<Colors>()
                               .Select(c => c.ToString())
                               .ToList();

Универсальный метод-помощник

Для многократного использования рекомендую написать generic-метод:

public static List<T> GetEnumList<T>() where T : Enum
{
    return Enum.GetValues(typeof(T)).Cast<T>().ToList();
}

// Использование:
List<Colors> colors = GetEnumList<Colors>();

Важные замечания:

  • Метод Enum.GetValues() работает корректно только с перечислениями, у которых нет повторяющихся значений или флаговых атрибутов ([Flags]). Для флаговых перечислений логика получения списка может отличаться.
  • В .NET 5+ и .NET Core рекомендуется использовать generic-версию Enum.GetValues<T>() для большей производительности и удобства: Enum.GetValues<Colors>().ToList().
  • Порядок элементов в списке соответствует порядку объявления значений в перечислении (начиная с 0).

Этот подход является стандартным и используется в большинстве проектов на C#. Он простой, читаемый и не требует дополнительных библиотек.

<<>>

Альтернативный подход: через цикл и ручное заполнение

Хотя LINQ-решение является самым популярным, вы также можете использовать классический цикл foreach для создания списка. Этот способ может быть полезен, если вы хотите явно контролировать процесс или избежать зависимости от LINQ в старых проектах.

using System;
using System.Collections.Generic;

public enum Colors
{
    Red,
    Green,
    Blue,
    Yellow
}

class Program
{
    static void Main()
    {
        List<Colors> colorsList = new List<Colors>();
        
        foreach (Colors color in Enum.GetValues(typeof(Colors)))
        {
            colorsList.Add(color);
        }
        
        // Используем список
        foreach (var color in colorsList)
        {
            Console.WriteLine($"Color: {color}");
        }
    }
}

Для получения строковых значений:

List<string> colorNames = new List<string>();
foreach (string name in Enum.GetNames(typeof(Colors)))
{
    colorNames.Add(name);
}

Плюсы и минусы:

  • Плюсы: Не требует подключения LINQ, более понятен новичкам, легко модифицировать (например, добавить фильтрацию значений).
  • Минусы: Больше кода, менее лаконично, чем LINQ-версия.

Этот подход полностью валиден и может использоваться в production-коде, особенно если вы предпочитаете явные конструкции. Однако в современной разработке на C# рекомендуется использовать LINQ-вариант как более короткий и выразительный.