C#遍历Flags枚举时如何过滤组合值仅遍历单比特位成员
解决方案
要实现仅遍历单比特位的枚举成员,只需要在原有判断逻辑中新增一层位运算校验,过滤掉多比特位的组合枚举值即可,核心判断逻辑为:
将枚举值转为整数后满足 val != 0 && (val & (val - 1)) == 0,即可确认该值仅设置了单个比特位。
修改后的代码示例
using System; using System.Collections.Generic; public class Program { [Flags] public enum Modes { A = 1 << 0, B = 1 << 1, C = 1 << 2, AC = A | C, All = ~0 } public class Type { public Type(Modes mode){} } public static List<Type> Create(Modes modesToCreate = Modes.All) { var list = new List<Type>(); foreach(Modes mode in Enum.GetValues(typeof(Modes))) { // 新增单比特位校验逻辑 long val = Convert.ToInt64(mode); bool isSingleBit = val != 0 && (val & (val - 1)) == 0; if(isSingleBit && modesToCreate.HasFlag(mode)) { Console.WriteLine(mode); list.Add(new Type(mode)); } } Console.WriteLine(); return list; } public static void Main() { Create(); Create(Modes.A | Modes.C); } }
运行输出结果
A B C A C
完全符合预期输出要求。
说明
- 使用
Convert.ToInt64转换枚举值是为了兼容所有整数类型的枚举底层类型,避免溢出问题 - 校验逻辑中的
val !=0是为了过滤掉枚举中可能定义的0值成员,该值没有设置任何有效比特位,不属于单比特位枚举项
内容的提问来源于stack exchange,提问作者RoQuOTriX
相关产品推荐
相关产品推荐

