Как пройти через все значения перечисления в C #? [Дубликат]

1062

У этого вопроса уже есть ответ:
Как перечислить перечисление? 14 ответов

public enum Foos
{
    A,
    B,
    C
}

Есть ли способ перебрать возможные значения Foos?

В принципе?

foreach(Foo in Foos)
Теги:
enums
language-features

8 ответов

1365
Лучший ответ

Да, вы можете использовать метод GetValues ​​

var values = Enum.GetValues(typeof(Foos));

Или введенная версия

var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();

Я давно добавил вспомогательную функцию в свою личную библиотеку только для такого случая.

public static class EnumUtil {
  public static IEnumerable<T> GetValues<T>() {
    return Enum.GetValues(typeof(T)).Cast<T>();
  }
}

Использование:

var values = EnumUtil.GetValues<Foos>();
  • 128
    Вы можете привести массив напрямую: (T[])Enum.GetValues(typeof(T))
  • 38
    Хорошая вещь в комментарии @ ŞafakGür заключается в том, что (1) вам не нужно проходить дополнительный итератор ( .Cast<Foos> ), и (2) вам не нужно помещать все значения в значения и снова распаковывать их. Приведение Şafak будет оставаться действительным до тех пор, пока они не изменят возвращаемый тип массива на какой-либо другой тип (например, object[] ). Но мы можем быть полностью уверены, что они этого не сделают, потому что (а) это приведет к потере производительности, (б) уже есть миллионы строк кода, использующих приведение Şafak, и все они сломаются с исключением во время выполнения.
Показать ещё 10 комментариев
540
foreach(Foos foo in Enum.GetValues(typeof(Foos)))
  • 4
    Это отличное решение. Используя «Foos» вместо «var», система вывода типов могла использовать правильную версию GetValues, которая возвращала правильный тип объекта. Ницца!
  • 3
    @RobertPatterson При использовании Foos ничто не является магическим выводом. Это явный актерский состав.
Показать ещё 1 комментарий
86
foreach (EMyEnum val in Enum.GetValues(typeof(EMyEnum)))
{
   Console.WriteLine(val);
}

Кредит Jon Skeet здесь: http://bytes.com/groups/net-c/266447-how-loop-each-items-enum

39
foreach (Foos foo in Enum.GetValues(typeof(Foos)))
{
    ...
}
24

ОБНОВЛЕНО
Некоторое время я вижу комментарий, который возвращает меня к моему старому ответу, и я думаю, что теперь я буду делать это по-другому. В эти дни я бы написал:

private static IEnumerable<T> GetEnumValues<T>()
{
    // Can't use type constraints on value types, so have to do check like this
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException("T must be of type System.Enum");
    }

    return Enum.GetValues(typeof(T)).Cast<T>();
}
  • 1
    Почему использование LINQ «правильнее»? Пожалуйста, обратите внимание. You can cast the array directly: (T[])Enum.GetValues(typeof(T)) @ SafakGür, эта версия имеет меньшие накладные расходы IMO.
  • 8
    упростить GetEnumValues <T> () где T: Enum
Показать ещё 3 комментария
16
static void Main(string[] args)
{
    foreach (int value in Enum.GetValues(typeof(DaysOfWeek)))
    {
        Console.WriteLine(((DaysOfWeek)value).ToString());
    }

    foreach (string value in Enum.GetNames(typeof(DaysOfWeek)))
    {
        Console.WriteLine(value);
    }
    Console.ReadLine();
}

public enum DaysOfWeek
{
    monday,
    tuesday,
    wednesday
}
5
 Enum.GetValues(typeof(Foos))
4

Да. Используйте метод GetValues ​​в System.Enum class.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню