如何遍历具有标志的Enum的值? [英] How to iterate over values of an Enum having flags?

查看:83
本文介绍了如何遍历具有标志的Enum的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

If I have a variable holding a flags enum, can I somehow iterate over the single-bit values in that specific variable? Or do I have to use Enum.GetValues to iterate over the entire enum and check which ones are set?

推荐答案

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

Coming back at this a few years later, with a bit more experience, my ultimate answer for single-bit values only, moving from lowest bit to highest bit, is a slight variant of Jeff Mercado's inner routine:

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的速度。)

It seems to work, and despite my objections of some years ago, I use HasFlag here, since it's far more legible than using bitwise comparisons and the speed difference is insignificant for anything I'll be doing. (It's entirely possible they've improved the speed of HasFlags since then anyway, for all I know...I haven't tested.)

这篇关于如何遍历具有标志的Enum的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆