使用 C# 枚举标志 Return 一组基于其按位或运算值的值

Using C# Enum Flags To Return A Set Of Values Based On Their Bit-Wise OR'ed Values

我了解到您可以通过这种方式配置 C# 枚举标志:

    [Flags]
    public enum MyEnum
    {
        Unknown = 0,
        Type1 = 1,
        Type2 = 2,
        Type3 = 4,
        Type4 = 8,
        Type5 = 16
    }

配置完成后,您可以像这样表示一组枚举:

MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2

然后你可以对这个集合进行检查,例如:

if(enumerationSet.HasFlag(MyEnum.Type1))
{
  // Do something
}

或者像这样打印它们的值:

Console.WriteLine("{0}", enumerationSet);

这将打印:

Type1, Type2

但是,我可以倒序吗?例如,如果我知道

MyEnum.Type1 | MyEnum.Type2 == 3

然后我可以问 MyEnum 它的 value/types 的哪一组等于 3?然后,我可以创建一个扩展方法 (GetSet) 来执行,如下所示:

List<MyEnum> myEnumSetList = MyEnum.GetSet(3)

返回一组 MyEnum 或一组值,即 {1, 2}

请指教


编辑:我终于弄明白了。在下面发布我的答案。

您可以将 Integer 转换为枚举并使用 & 比较。

例子

var num = 1;
var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);

然后如果它存在,你可以在你的扩展方法中return它。

完整代码

 var enumList = new List<MyEnum>();
            var testNumbers = new List<int>{ 1, 2, 4};
            MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2;
            foreach (var num in testNumbers)
            {
                var doesExist = (((enumerationSet) & ((MyEnum) num)) != 0);
                if (doesExist)
                    enumList.Add((MyEnum)num);
            }

            enumList.ForEach(x => Console.WriteLine(x.ToString()));
            return enumList;

您可以使用以下代码手动解析它:

    var res = 3;
    var myEnumSetList = res.ToString()
              .Split(new[] { ", " }, StringSplitOptions.None)
              .Select(v => (MyEnum)Enum.Parse(typeof(MyEnum), v)).ToList();

如果你想要一个标志列表,你可以使用这个:

var f = 1 + 4 + 8;
var s = Convert.ToString(f, 2);
var flags =
    s.Where(w=> w !='0').Select(
        (c, i) =>
            (MyEnum)Enum.Parse(typeof(MyEnum),
                    (int.Parse(c.ToString())*Math.Pow(2, i)).ToString(CultureInfo.InvariantCulture)));

经过一些修改后,我能够根据相应集合的值解析枚举值列表或:

protected List<MyEnum> GetEnumSet(int flagNumber)
{
      List<MyEnum> resultList= new List<MyEnum>();

      foreach (MyEnum value in Enum.GetValues(typeof(MyEnum)))
      {
         if (((MyEnum)flagNumber).HasFlag(value))
         {
             resultList.Add(value);
         }
      }

      return resultList;
}

这里,flagNumber 是各自列表或运算后的值,即 MyEnum.Type1 |我的枚举类型 2。因此,通过发送此方法 flagNumber,我得到列表 { MyEnum.Type1, MyEnum.Type2 }