Как преобразовать перечисление (enum) в список (List) в C#?
Преобразование 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-вариант как более короткий и выразительный.
Ответов пока нет.
Войдите чтобы оставить ответ