C# 按位枚举/标志实例枚举/迭代/foreach 但是如何迭代按位枚举实例呢?

C# 按位枚举/标志实例枚举/迭代/foreach 但是如何迭代按位枚举实例呢?,c#,.net,linq,enums,foreach,C#,.net,Linq,Enums,Foreach,假设Suit是一个没有重叠值的按位枚举,那么这就足够了: var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>(); foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) { // ... } var availableSuits=Enum.GetValues(typeof(Suit)).Cast(); foreach(可用套装中的套装,其

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

var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
    // ...
}
var availableSuits=Enum.GetValues(typeof(Suit)).Cast();
foreach(可用套装中的套装,其中(mySuits.HasFlag)){
// ...
}
如果需要快速,或者需要忽略复合值或零值,那么您可能应该检查
循环中两个的连续幂,并确定哪些值以这种方式匹配。

我的建议:

foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}
foreach(Enum.GetValues(typeof(Suit)).Cast()中的var项,其中(item=>mySuit.hasvag(item)))
{
//做点什么
}

枚举只是一种值类型-它是不可编辑的

不是完美的(拳击),但它确实起到了作用

/// <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;
        }
    }
}

您的
Where
在我用Fischermaens
item=>mySuits.hasvag(item)
替换之前对我不起作用。谢谢你的解决方案!:我认为两个答案几乎相同,但我会接受你的额外评论,因为你是第一个:)我猜你对我的问题投了反对票(尽管我没有投你反对票)?上面的帖子显示它是可iterable的,所以我不确定您假定的下一票的原因……如果您不熟悉位枚举,它在某些情况下(和所有事情一样)是有用的,那么Frep D-Oronge:您错了,它们可以使用LINQ进行iterable(请参阅mquader和我的答案)
foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}
/// <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())
    {
        ...
    }