enum bitwise / flags实例枚举/迭代/ foreach

时间:2011-11-08 18:18:04

标签: c# .net linq enums foreach

Whole enum iteration

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

但是如何迭代按位枚举实例?

Suit mySuits = Suit.Hearts | Suit.Diamonds;
// How to now iterate mySuits, which should loop twice instead of four times?

4 个答案:

答案 0 :(得分:6)

假设Suit是一个没有重叠值的按位枚举,那么这就足够了:

var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
    // ...
}

如果需要快速,或者需要忽略复合值或零值,则应该在for循环中检查两个连续的幂,并确定哪个值与该方式匹配。< / p>

答案 1 :(得分:2)

我的建议:

foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}

答案 2 :(得分:1)

不完美(拳击),但它完成了工作......

/// <summary>
/// Return an enumerators of input flag(s)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static IEnumerable<T> GetFlags<T>(this T input)
{
    foreach (Enum value in Enum.GetValues(input.GetType()))
    {
        if ((int) (object) value != 0) // Just in case somebody has defined an enum with 0.
        {
            if (((Enum) (object) input).HasFlag(value))
                yield return (T) (object) value;
        }
    }
}

用法:

    FileAttributes att = FileAttributes.Normal | FileAttributes.Compressed;
    foreach (FileAttributes fa in att.GetFlags())
    {
        ...
    }

答案 3 :(得分:-3)

枚举只是一种值类型 - 它不可迭代。