2009-04-24 9 views
5

J'ai la structure ENUM comme suit:obtenir une liste des énumérations disponibles

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

Maintenant, je veux obtenir une liste des MyEnum, à savoir List<MyEnum> qui contient toutes les One, TwoThree. Again, je cherche un doublure qui fait la chose. Je suis sorti avec une requête LINQ mais il n'a pas été satisfaisante, car il était un peu trop long, je pense:

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

Une meilleure suggestion?

Répondre

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

Bien sûr, ToList() si vous avez vraiment besoin de faire une liste en particulier. – mquander

2

Pas un revêtement (bien la mise en œuvre n'est pas, mais la méthode est la suivante: P), mais peut-être ajouter quelque chose comme this à une classe d'outils/utilitaire qui renvoie une liste générique:

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

J'aurais préféré ma propre solution à la vôtre. – Graviton

+0

Ne serait-ce pas bien si C# avait une contrainte générique "where T: enum"? –

+0

C'est bien, mais avez-vous vraiment besoin de downvote ma suggestion? heh –

3

Je suis d'accord avec le code @ mquander.

Cependant, je vous suggère également cache la liste, car il est extrêmement peu probable de changer au cours de l'exécution de votre programme. Mettez-le dans une variable statique en lecture seule dans un emplacement global:

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