2009-04-24 27 views
5

Ho la struttura enum come segue:ottenere una lista dei disponibili Enums

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

Ora voglio ottenere un elenco di MyEnum, vale a dire, List<MyEnum> che contiene tutte le One, TwoThree. Again, sto cercando una fodera che faccia la cosa. Sono uscito con una query LINQ ma era insoddisfacente perché era un po 'troppo lungo, penso:

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

un suggerimento migliore?

risposta

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

Ovviamente, ToList() se è davvero necessario fare un elenco in particolare. – mquander

2

Non uno di linea (ben l'attuazione non è, ma il metodo è: P), ma forse aggiungere qualcosa di simile a una classe this strumenti/utility che restituirà un elenco generico:

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

Preferirei la mia soluzione al tuo. – Graviton

+0

Non sarebbe bello se C# avesse un vincolo generico "where T: enum"? –

+0

Va bene, ma hai davvero bisogno di downvotare il mio suggerimento? heh –

3

Sono d'accordo con il codice di @mquander.

Tuttavia, vorrei suggerire anche cache l'elenco, poiché è estremamente improbabile che cambi nel corso dell'esecuzione del programma. Mettilo in una variabile statica readonly in qualche luogo globale:

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