首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举按位/标志实例枚举/iteration/foreach

枚举按位/标志实例枚举/iteration/foreach
EN

Stack Overflow用户
提问于 2011-11-09 02:18:04
回答 4查看 3.2K关注 0票数 4

Whole enum iteration

代码语言:javascript
复制
foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
    // ...
}

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

代码语言:javascript
复制
Suit mySuits = Suit.Hearts | Suit.Diamonds;
// How to now iterate mySuits, which should loop twice instead of four times?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-09 02:21:45

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

代码语言:javascript
复制
var availableSuits = Enum.GetValues(typeof(Suit)).Cast<Enum>();
foreach (Suit suit in availableSuits.Where(mySuits.HasFlag)) {
    // ...
}

如果它需要更快,或者如果它需要忽略组合值或零值,那么您可能应该在for循环中检查连续的2的幂,并确定哪些值以这种方式匹配。

票数 6
EN

Stack Overflow用户

发布于 2011-11-09 02:27:22

我的建议是:

代码语言:javascript
复制
foreach (var item in Enum.GetValues(typeof(Suit)).Cast<Enum>().Where(item => mySuit.HasFlag(item)))
{
    // Do something
}
票数 2
EN

Stack Overflow用户

发布于 2016-06-04 02:40:35

不是完美的(拳击),但它做了工作...

代码语言:javascript
复制
/// <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;
        }
    }
}

用法:

代码语言:javascript
复制
    FileAttributes att = FileAttributes.Normal | FileAttributes.Compressed;
    foreach (FileAttributes fa in att.GetFlags())
    {
        ...
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8055206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档