2

我正在尝试生成标记枚举的逆。下面是枚举:

[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
}

的结果值为,这tC | D | E | F期望的结果。这种方法有效,但我希望有一种更简单的方法来使用 LINQ 进行整合,如上所示(如果更简单,其他非 LINQ 方法也可以接受)。

谢谢!

4

1 回答 1

2

我的不受约束的旋律项目使这变得非常简单:

MyType inverse = mtGroup1.UsedBitsInverse();

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

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

MyType t = UsedBitsOfMyType & ~mtGroup1;
于 2012-07-26T21:39:47.957 回答