迭代枚举类型

时间:2011-08-10 12:28:40

标签: c# enums iteration

  

可能重复:
  How do I enumerate an enum?

我不知道是否有可能做我想做的事,但我想为什么不这样做。

我有例子枚举:

public enum Animals {
    Cat,
    Dog,
    ...
}

我想要做的是迭代这个枚举。我希望它能像那样工作:

foreach( var type in Animals ) {
    Console.WriteLine( type.toString() );
}

,输出结果为:

 Cat
 Dog

有可能吗?我不想把每个项目都放到一个数组中,然后迭代,我想直接迭代这个枚举。

5 个答案:

答案 0 :(得分:19)

编辑:请注意,在此答案中,我已将Animals重命名为Animal。根据.NET约定,只有基于标志的枚举应该具有复数名称。

您可以使用Enum.GetValues()

foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

如Dan的评论中所述,如果您在foreach循环中使用显式输入,则无需强制转换:

foreach (Animal type in Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

但是现在你不会尽早发现错误。例如:

foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) {
    Console.WriteLine(type.toString());
}

SomeEmptyEnum显然是一个空的枚举类型。这里GetValues将返回一个类型为SomeEmptyEnum[]的空数组。上面的代码只会检查返回的数组的每个成员是否属于正确的类型,因此您不会发现问题。显然这在现实生活中不太可能发生,但它展示了代码味道,这导致我转换结果 - 基本上我更喜欢处理强类型集合。


或者,对于更加类型安全的方法,您可以使用我的Unconstrained Melody库:

foreach (var type in Enums.GetValues<Animal>()) {
    Console.WriteLine(type.ToString());
}

我的Enums.GetValues<T>()会在此处返回IList<T>,表示:

  • 没有必要施展
  • 它实际上返回一个不可变列表,因此不需要每次都创建一个新集合,这与标准Enum.GetValues()
  • 不同

它还有一个通用约束,强制T成为枚举类型,所以你不能不小心地用非枚举类型调用它,不像Enum.GetValues() ......

答案 1 :(得分:1)

Enum.GetValues是你的朋友。

答案 2 :(得分:1)

使用Enum.GetNames()循环查看枚举成员的名称。使用Enum.GetValues()循环显示值。

答案 3 :(得分:1)

要在Jon's answer中保存一些输入,请明确指定类型,您不必进行强制转换:

foreach (Animal a in Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(a);
}

但是,explained by Jon需要另外注意。

另请注意,C#枚举名称通常应采用单数形式(Animal,而非Animals),除非它们标有[Flags]属性,允许组合。

答案 4 :(得分:1)

试试这个:

    enum animals
    {
        cat,
        dog,
        fish
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (string myAnimal in Enum.GetNames(typeof(animals)))
        {
            Debug.WriteLine(myAnimal);
        }
    }

你必须遍历Enum.Getnames(typeof(yourEnum))。

祝你好运。