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?发布于 2011-11-09 02:21:45
假设Suit是一个没有重叠值的逐位枚举,那么这就足够了:
var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
// ...
}如果它需要更快,或者如果它需要忽略组合值或零值,那么您可能应该在for循环中检查连续的2的幂,并确定哪些值以这种方式匹配。
发布于 2011-11-09 02:27:22
我的建议是:
foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
// Do something
}发布于 2016-06-04 02:40:35
不是完美的(拳击),但它做了工作...
/// <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())
{
...
}https://stackoverflow.com/questions/8055206
复制相似问题