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

Cel*_*Cel 3 .net c# linq foreach enums

整个枚举迭代

foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Suit mySuits = Suit.Hearts | Suit.Diamonds;
// How to now iterate mySuits, which should loop twice instead of four times?
Run Code Online (Sandbox Code Playgroud)

mqp*_*mqp 6

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

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

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