2009-04-24 3 views
5

У меня есть структура перечислимой следующим образом:Получить список доступного Перечисления

public enum MyEnum 
{ 
    One=1, 
    Two=2, 
    Three=3 
} 

Теперь я хочу, чтобы получить список MyEnum, т.е. List<MyEnum>, который содержит все One, TwoThree. Again, я ищу один вкладыш, который делает вещь. Я вышел с запросом LINQ, но это было неудовлетворительным, потому что это было немного слишком долго, я думаю:

Enum.GetNames(typeof(MyEnum)) 
          .Select(exEnum => 
           (MyEnum)Enum.Parse(typeof(MyEnum), exEnum)) 
          .ToList(); 

Лучшее предложение?

ответ

14
Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 
+3

Конечно, ToList() это, если вам действительно нужно сделать список в частности. – mquander

2

Не один лайнер (а реализация не является, но метод: P), но, возможно, добавить что-то вроде this к классу инструментов/утилита, которая будет возвращать общий список:

public static List<T> EnumToList<T>() 

{ 

Type enumType = typeof(T); 

// Can't use type constraints on value types, so have to do check like this 

if (enumType.BaseType != typeof(Enum)) 

    throw new ArgumentException("T must be of type System.Enum"); 

return new List<T>(Enum.GetValues(enumType) as IEnumerable<T>); 

} 
+0

Я бы предпочел свое собственное решение для вас. – Graviton

+0

Было бы неплохо, если бы у C# было общее ограничение «где T: enum»? –

+0

Это нормально, но действительно ли вам нужно было понизить предложение? heh –

3

Я согласен с кодом @ mquander.

Однако, я предлагаю вам также кэш, так как он вряд ли изменится в ходе выполнения вашей программы. Поместите его в статическую переменную readonly в некотором глобальном местоположении:

public static class MyGlobals 
{ 
    public static readonly List<MyEnum> EnumList = 
     Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList(); 
} 
Смежные вопросы