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?
答案 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)
枚举只是一种值类型 - 它不可迭代。