Question Comment convertir un enum en une liste en C #? [dupliquer]


Cette question a déjà une réponse ici:

Y a-t-il un moyen de convertir un enum à une liste qui contient toutes les options de l'énumération?


482
2017-07-22 18:48


origine


Réponses:


Cela retournera un IEnumerable<SomeEnum> de toutes les valeurs d'un Enum.

Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();

Si vous voulez que cela soit un List<SomeEnum>, Ajoutez simplement .ToList() après .Cast<SomeEnum>().

Pour utiliser la fonction Cast sur un tableau, vous devez avoir System.Linq dans votre section d'utilisation.


823
2017-07-22 18:49



Moyen beaucoup plus facile:

Enum.GetValues(typeof(SomeEnum))
    .Cast<SomeEnum>()
    .Select(v => v.ToString())
    .ToList();

75
2017-12-05 11:42



La réponse courte est, utilisez:

(SomeEnum[])Enum.GetValues(typeof(SomeEnum))

Si vous en avez besoin pour une variable locale, c'est var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));.

Pourquoi la syntaxe est-elle comme ça ?!

le static méthode GetValues a été introduit dans l'ancien. NET 1.0 jours. Il renvoie un tableau unidimensionnel de type d'exécution SomeEnum[]. Mais comme c'est une méthode non générique (les génériques n'ont pas été introduits avant .NET 2.0), elle ne peut pas déclarer son type de retour (type de retour à la compilation) en tant que tel.

Les tableaux .NET ont une sorte de covariance, mais parce que SomeEnum va etre un type de valeur, et parce que la covariance de type tableau ne fonctionne pas avec les types de valeur, ils ne pouvaient même pas déclarer le type de retour comme un object[] ou Enum[]. (Ceci est différent par ex. cette surcharge de GetCustomAttributes à partir de .NET 1.0 qui a un type de retour à la compilation object[] mais retourne en réalité un tableau de type SomeAttribute[] où SomeAttribute est nécessairement un type de référence.)

Pour cette raison, la méthode .NET 1.0 a dû déclarer son type de retour comme System.Array. Mais je vous garantis que c'est un SomeEnum[].

Chaque fois que vous appelez GetValues de nouveau avec le même type enum, il devra allouer un nouveau tableau et copier les valeurs dans le nouveau tableau. C'est parce que les tableaux peuvent être écrits (modifiés) par le "consommateur" de la méthode, ils doivent donc créer un nouveau tableau pour s'assurer que les valeurs sont inchangées. .NET 1.0 n'a pas eu de bonnes collections en lecture seule.

Si vous avez besoin de la liste de toutes les valeurs à différents endroits, pensez à appeler GetValues juste une fois et mettre le résultat en cache en lecture seule, par exemple comme ceci:

public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues
    = Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));

Ensuite, vous pouvez utiliser AllSomeEnumValues plusieurs fois, et la même collection peut être réutilisée en toute sécurité.

Pourquoi est-ce mauvais d'utiliser .Cast<SomeEnum>()?

Beaucoup d'autres réponses utilisent .Cast<SomeEnum>(). Le problème avec cela est qu'il utilise le non-générique IEnumerable implémentation de Array classe. Ce devrait ont impliqué la boxe de chacune des valeurs dans un System.Object boîte, puis en utilisant le Cast<> méthode pour déballer toutes ces valeurs à nouveau. Heureusement, le .Cast<> méthode semble vérifier le type d'exécution de son IEnumerable paramètre (le this paramètre) avant qu'il ne commence à parcourir la collection, donc ce n'est pas si mal après tout. Il s'avère .Cast<> laisse passer la même instance de tableau.

Si vous le suivez par .ToArray() ou .ToList(), un péché:

Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this

vous avez un autre problème: vous créez une nouvelle collection (tableau) lorsque vous appelez GetValueset ensuite créer encore une nouvelle collection (List<>) avec le .ToList() appel. C'est donc une allocation redondante (supplémentaire) d'une collection entière pour contenir les valeurs.


61
2018-05-06 19:41



Voici la façon dont j'aime, en utilisant LINQ:

public class EnumModel
{
    public int Value { get; set; }
    public string Name { get; set; }
}

public enum MyEnum
{
    Name1=1,
    Name2=2,
    Name3=3
}

public class Test
{
    List<EnumModel> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).Select(c => new EnumModel() { Value = (int)c, Name = c.ToString() }).ToList();
}

J'espère que cela aide


21
2018-01-23 16:13



List <SomeEnum> theList = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();

19
2018-03-14 19:58



réponse très simple

Voici une propriété que j'utilise dans l'une de mes applications

public List<string> OperationModes
{
    get
    {
       return Enum.GetNames(typeof(SomeENUM)).ToList();
    }
}

9
2018-01-09 22:25



J'ai toujours eu une liste de enum des valeurs comme celle-ci:

Array list = Enum.GetValues(typeof (SomeEnum));

5
2018-01-31 07:41



Ici pour l'utilité ... du code pour obtenir les valeurs dans une liste, qui convertit l'énumération en forme lisible pour le texte

public class KeyValuePair
  {
    public string Key { get; set; }

    public string Name { get; set; }

    public int Value { get; set; }

    public static List<KeyValuePair> ListFrom<T>()
    {
      var array = (T[])(Enum.GetValues(typeof(T)).Cast<T>());
      return array
        .Select(a => new KeyValuePair
          {
            Key = a.ToString(),
            Name = a.ToString().SplitCapitalizedWords(),
            Value = Convert.ToInt32(a)
          })
          .OrderBy(kvp => kvp.Name)
         .ToList();
    }
  }

.. et la méthode d'extension System.String:

/// <summary>
/// Split a string on each occurrence of a capital (assumed to be a word)
/// e.g. MyBigToe returns "My Big Toe"
/// </summary>
public static string SplitCapitalizedWords(this string source)
{
  if (String.IsNullOrEmpty(source)) return String.Empty;
  var newText = new StringBuilder(source.Length * 2);
  newText.Append(source[0]);
  for (int i = 1; i < source.Length; i++)
  {
    if (char.IsUpper(source[i]))
      newText.Append(' ');
    newText.Append(source[i]);
  }
  return newText.ToString();
}

5
2018-06-09 14:37