2009-04-24 17 views
5

Mam struktury enum następująco:uzyskać listę dostępnych wyliczenia

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

Teraz chcę uzyskać listę MyEnum, tj List<MyEnum> że zawiera wszystkie One, TwoThree. Again, Szukam jednej liniowej, która to robi. Wyszedłem z kwerendy LINQ, ale to było niezadowalające, ponieważ był nieco zbyt długo, myślę:

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

lepszy pomysł?

Odpowiedz

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

Oczywiście, ToList() to, jeśli naprawdę musisz zrobić listę w szczególności. – mquander

2

Nie jeden liner (również realizacja nie jest, ale metoda jest: P), ale może dodać coś takiego this do klasy narzędzi/użytkowego, który zwróci listę Generic:

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

Wolałbym własne rozwiązanie od Ciebie. – Graviton

+0

Czy nie byłoby miło, gdyby C# posiadało ogólne ograniczenie "where T: enum"? –

+0

W porządku, ale czy naprawdę musiałaś zgodzić się z moją sugestią? heh –

3

Zgadzam się z kodem @ mquander.

Jednakże, sugerowałbym Ci także cache na liście, ponieważ jest bardzo mało prawdopodobne, aby uległa zmianie w trakcie wykonywania twojego programu. Umieść go w statycznej zmiennej tylko do odczytu w pewnej lokalizacji globalnej:

public static class MyGlobals 
{ 
    public static readonly List<MyEnum> EnumList = 
     Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList(); 
} 
Powiązane problemy