首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何迭代具有标志的枚举的值?

如何迭代具有标志的枚举的值?
EN

Stack Overflow用户
提问于 2010-11-13 13:34:54
回答 16查看 75.2K关注 0票数 148

如果我有一个包含标志枚举的变量,我可以以某种方式迭代该特定变量中的单位值吗?或者,我是否必须使用Enum.GetValues遍历整个枚举并检查设置了哪些枚举?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2014-03-06 18:52:16

几年后,随着经验的增加,我对单个位值的最终答案是从最低位移动到最高位,这是Jeff Mercado内部例程的一个轻微变体:

代码语言:javascript
复制
public static IEnumerable<Enum> GetUniqueFlags(this Enum flags)
{
    ulong flag = 1;
    foreach (var value in Enum.GetValues(flags.GetType()).Cast<Enum>())
    {
        ulong bits = Convert.ToUInt64(value);
        while (flag < bits)
        {
            flag <<= 1;
        }

        if (flag == bits && flags.HasFlag(value))
        {
            yield return value;
        }
    }
}

它似乎是有效的,尽管我在几年前就反对过,但我在这里使用HasFlag,因为它比使用逐位比较容易理解得多,并且速度差异对于我将要做的任何事情都是微不足道的。(从那时起,他们完全有可能提高了HasFlags的速度,就我所知……我还没有测试过。)

票数 28
EN

Stack Overflow用户

发布于 2010-11-13 14:26:12

代码语言:javascript
复制
static IEnumerable<Enum> GetFlags(Enum input)
{
    foreach (Enum value in Enum.GetValues(input.GetType()))
        if (input.HasFlag(value))
            yield return value;
}
票数 195
EN

Stack Overflow用户

发布于 2013-12-06 03:33:03

以下是Linq对该问题的解决方案。

代码语言:javascript
复制
public static IEnumerable<Enum> GetFlags(this Enum e)
{
      return Enum.GetValues(e.GetType()).Cast<Enum>().Where(e.HasFlag);
}
票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4171140

复制
相关文章

相似问题

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