You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:06:05