如何在C#中枚举枚举?

例如,以下代码无法编译:

public enum Suit
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod()
{
    foreach (Suit suit in Suit)
    {
        DoSomething(suit);
    }
}

它给出了以下编译时错误:

“Suit”是“type”,但与“variable”类似

它在第二个Suit关键字上失败。


当前回答

foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
}

(目前公认的答案有一个我不认为的演员阵容需要(尽管我可能错了)。)

其他回答

有两种方法可以迭代枚举:

1. var values =  Enum.GetValues(typeof(myenum))
2. var values =  Enum.GetNames(typeof(myenum))

第一个将以**对象**s数组的形式提供值,第二个将以**String**s数组形式提供值。

在foreach循环中使用它,如下所示:

foreach(var value in values)
{
    // Do operations here
}

如果您需要在构建和运行时进行速度和类型检查,则此助手方法比使用LINQ来强制转换每个元素要好:

public static T[] GetEnumValues<T>() where T : struct, IComparable, IFormattable, IConvertible
{
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException(string.Format("{0} is not of type System.Enum", typeof(T)));
    }
    return Enum.GetValues(typeof(T)) as T[];
}

您可以按如下方式使用它:

static readonly YourEnum[] _values = GetEnumValues<YourEnum>();

当然,您可以返回IEnumerable<T>,但这不会给您带来任何好处。

枚举类型被称为“枚举类型”,并不是因为它们是“枚举”值的容器(它们不是),而是因为它们是通过枚举该类型变量的可能值来定义的。

(实际上,这有点复杂——枚举类型被认为具有“基础”整数类型,这意味着每个枚举值都对应一个整数值(这通常是隐式的,但可以手动指定)。C#的设计方式使您可以将该类型的任何整数填充到枚举变量中,即使它不是“命名”值。)

System.Enum.GetNames方法可用于检索字符串数组,如名称所示,字符串数组是枚举值的名称。

EDIT:应该建议改用System.Enum.GetValues方法。哎呀。

我想你可以用

Enum.GetNames(Suit)

新的.NET 5解决方案:

.NET 5为GetValues方法引入了新的通用版本:

Suit[] suitValues = Enum.GetValues<Suit>();

这是目前为止最方便的方法。

foreach循环中的用法:

foreach (Suit suit in Enum.GetValues<Suit>())
{

}

如果您只需要枚举名作为字符串,则可以使用通用的GetNames方法:

string[] suitNames = Enum.GetNames<Suit>();