小编典典

如何遍历具有标志的Enum的值?

c#

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


阅读 380

收藏
2020-05-19

共1个答案

小编典典

回到几年后,有了更多的经验,我对单比特值(从最低比特到最高比特)的最终回答是Jeff Mercado内部例程的一个细微变化:

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的速度,据我所知……我还没有测试。)

2020-05-19