如何在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)))
{
}

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

其他回答

如果您有:

enum Suit
{
   Spades,
   Hearts,
   Clubs,
   Diamonds
}

这:

foreach (var e in Enum.GetValues(typeof(Suit)))
{
    Console.WriteLine(e.ToString() + " = " + (int)e);
}

将输出:

Spades = 0
Hearts = 1
Clubs = 2
Diamonds = 3

使用Cast<T>:

var suits = Enum.GetValues(typeof(Suit)).Cast<Suit>();

好了,IEnumerable<Suit>。

某些版本的.NET框架不支持Enum.GetValues。以下是Ideas 2.0的一个很好的解决方法:Compact framework中的Enum.Get Values:

public Enum[] GetValues(Enum enumeration)
{
    FieldInfo[] fields = enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
    Enum[] enumerations = new Enum[fields.Length];

    for (var i = 0; i < fields.Length; i++)
        enumerations[i] = (Enum) fields[i].GetValue(enumeration);

    return enumerations;
}

与任何涉及反射的代码一样,您应该采取措施确保它只运行一次并缓存结果。

通过组合最重要的答案,我总结了一个非常简单的扩展:

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this T value) where T : Enum
    {
        return (T[])Enum.GetValues(typeof (T));
    }
}

它干净、简单,而且,根据@Jeppe Stig Nielsen的评论,速度很快。

foreach(Enum.GetValues中的套装(typeof(套装))){}我听到一些模糊的谣言,说这是非常缓慢。有人知道吗猎户座Edwards 2008年10月15日1:31 7

我认为缓存阵列会大大加快速度。看起来每次都会得到一个新的数组(通过反射)。相反:

Array enums = Enum.GetValues(typeof(Suit));
foreach (Suit suitEnum in enums) 
{
    DoSomething(suitEnum);
}

这至少快一点,对吧?