136 votes

C# Itération dans un enum ? (Indexation d'un tableau System.Array)

J'ai le code suivant :

// Obtain the string names of all the elements within myEnum 
String[] names = Enum.GetNames( typeof( myEnum ) );

// Obtain the values of all the elements within myEnum 
Array values = Enum.GetValues( typeof( myEnum ) );

// Print the names and values to file
for ( int i = 0; i < names.Length; i++ )
{
    print( names[i], values[i] ); 
}

Cependant, je ne peux pas indexer les valeurs. Existe-t-il un moyen plus simple de le faire ?

Ou est-ce que j'ai raté quelque chose !

235voto

Frederik Gheysels Points 36354
Array values = Enum.GetValues(typeof(myEnum));

foreach( MyEnum val in values )
{
   Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
}

Ou bien, vous pouvez exprimer le System.Array qui est retourné :

string[] names = Enum.GetNames(typeof(MyEnum));
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));

for( int i = 0; i < names.Length; i++ )
{
    print(names[i], values[i]);
}

Mais, pouvez-vous être sûr que GetValues renvoie les valeurs dans le même ordre que GetNames renvoie les noms ?

3 votes

"Mais, pouvez-vous être sûr que GetValues retourne les valeurs dans le même ordre que GetNames retourne les noms ?" -- C'est un très bon point et quelque chose que je n'ai pas encore abordé ! Je pense que votre première solution fournirait probablement un moyen de faire correspondre les valeurs et les chaînes de manière fiable.

0 votes

Bonjour, j'ai déjà entendu parler d'une suspicion de "non-concordance d'index" lors de cette opération ; cependant, je n'ai pas encore découvert si c'est vraiment un problème ou non ? Existe-t-il des cas précis dans lesquels cette hypothèse peut être erronée ? Merci !

0 votes

Vous voudrez probablement convertir le deuxième "val" en un int, si vous voulez résoudre le problème de la non-concordance des valeurs, comme dans le cas suivant Enum.GetName(typeof(MyEnum), val), (int)val) dans lequel la sortie fournit le nom et le numéro de l'énumération.

36voto

Marc Gravell Points 482669

Vous devez effectuer un casting du tableau - le tableau retourné est en fait du type demandé, c'est à dire myEnum[] si vous demandez typeof(myEnum) :

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));

Puis values[0] etc.

10voto

Arcturus Points 14366

Vous pouvez convertir ce tableau en différents types de tableaux :

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));

ou si vous voulez les valeurs entières :

int[] values = (int[])Enum.GetValues(typeof(myEnum));

Vous pouvez itérer ces tableaux casted bien sûr :)

8voto

Mohammadreza Points 1964

Pourquoi pas une liste de dictionnaires ?

Dictionary<string, int> list = new Dictionary<string, int>();
foreach( var item in Enum.GetNames(typeof(MyEnum)) )
{
    list.Add(item, (int)Enum.Parse(typeof(MyEnum), item));
}

et bien sûr, vous pouvez modifier le type de valeur du dictionnaire pour qu'il corresponde aux valeurs de votre enum.

0 votes

Je pense que c'est la meilleure solution, mais malheureusement, l'enum se trouve dans une zone de code sur laquelle je n'ai aucun contrôle !

1 votes

La seule solution que j'ai trouvée pour obtenir les valeurs entières réelles de l'enum !

4voto

Paul Points 41

Une autre solution, avec des possibilités intéressantes :

enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

static class Helpers
{
public static IEnumerable<Days> AllDays(Days First)
{
  if (First == Days.Monday)
  {
     yield return Days.Monday;
     yield return Days.Tuesday;
     yield return Days.Wednesday;
     yield return Days.Thursday;
     yield return Days.Friday;
     yield return Days.Saturday;
     yield return Days.Sunday;
  } 

  if (First == Days.Saturday)
  {
     yield return Days.Saturday;
     yield return Days.Sunday;
     yield return Days.Monday;
     yield return Days.Tuesday;
     yield return Days.Wednesday;
     yield return Days.Thursday;
     yield return Days.Friday;
  } 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X