如果我有一个持有标志枚举的变量,我可以以某种方式遍历该特定变量中的位值吗?还是我必须使用Enum.GetValues遍历整个枚举并检查设置了哪些枚举?
回到几年后,有了更多的经验,我对单比特值(从最低比特到最高比特)的最终回答是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的速度,据我所知……我还没有测试。)