使用LINQ标记的枚举合并(逆组合)

时间:2012-07-26 21:36:34

标签: c# linq enums enum-flags

我正在尝试生成标记枚举的反转。以下是枚举:

[Flags]
public enum MyType
{
  Unknown = 0,
  A = 1 << 0,
  B = 1 << 2,
  C = 1 << 3,
  D = 1 << 4,
  E = 1 << 5,
  F = 1 << 6
}

我定义了一个静态MyType mtGroup1,其值为(A | B)。我想生成相反的结果,不包括Unknown

我的解决方案:

MyType t = MyType.Unknown;
foreach (var vType in Enum.GetValues(typeof(MyType)).OfType<MyType>())
{
    if ((mtGroup1 & vType) != vType)
         t = t | vType;   //Consolidates into a single enum, excluding unknown
}

t的结果值为C | D | E | F,这是期望的结果。 这种方法有效,但我希望有一种更简单的方法可以使用LINQ进行整合,如果更简单的话,其他非LINQ方式也可以接受。

谢谢!

1 个答案:

答案 0 :(得分:2)

我的Unconstrained Melody项目让这很简单:

MyType inverse = mtGroup1.UsedBitsInverse();

该项目包含许多有用的方法(许多编写为扩展方法),这些方法使用“不可言说的”通用约束(C#编译器理解但不能用C#表示)将约束泛型类型参数限制为枚举类型或代理。通过这种方式,上面的代码可以在没有任何装箱的情况下工作 - 它实际上可以计算枚举类型的所有“有趣”位,这是第一次与Unconstrained Melody一起使用时,所以这个操作非常有效

如果您不想使用Unconstrained Melody,您可以编写自己的方法来查找枚举的“已用位”,然后使用:

MyType t = UsedBitsOfMyType & ~mtGroup1;