Можете ли вы пройтись по перечислению в C #? - PullRequest
31 голосов
/ 30 сентября 2011
for (int i = (int)MY_ENUM.First; i <= (int)MY_ENUM.Last; i++)
{
    //do work
}

Есть ли более элегантный способ сделать это?

Ответы [ 4 ]

58 голосов
/ 30 сентября 2011

Вы должны иметь возможность использовать следующее:

foreach (MY_ENUM enumValue in Enum.GetValues(typeof(MY_ENUM)))
{
   // Do work.
}
8 голосов
/ 30 сентября 2011

Перечисления похожи на целые числа, но вы не можете полагаться на их значения, чтобы они всегда были последовательными или восходящими. Вы можете присвоить целочисленные значения значениям перечисления, которые нарушат ваш простой цикл for:

public class Program
{
    enum MyEnum
    {
        First = 10,
        Middle,
        Last = 1
    }

    public static void Main(string[] args)
    {
        for (int i = (int)MyEnum.First; i <= (int)MyEnum.Last; i++)
        {
            Console.WriteLine(i); // will never happen
        }

        Console.ReadLine();
    }
}

Как говорили другие, вместо этого Enum.GetValues.

6 голосов
/ 30 сентября 2011

Взгляните на Enum.GetValues:

foreach (var value in Enum.GetValues(typeof(MY_ENUM))) { ... }
2 голосов
/ 30 сентября 2011

Метод public static Array GetValues(Type enumType) возвращает массив со значениями перечисления anEnum. Поскольку массивы реализуют интерфейс IEnumerable, их можно перечислять. Например:

 EnumName[] values = (EnumName[])Enum.GetValues(typeof(EnumName));
 foreach (EnumName n in values) 
     Console.WriteLine(n);

Более подробное объяснение вы можете найти на MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...