我正在尝试生成标记枚举的逆。下面是枚举:
[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 方法也可以接受)。
谢谢!
最佳答案
我的Unconstrained Melody项目使这变得非常简单:
MyType inverse = mtGroup1.UsedBitsInverse();
该项目包含许多有用的方法(许多编写为扩展方法),这些方法使用“不可言说的”泛型约束(C# 编译器可以理解但无法用 C# 表达的约束)来约束泛型类型参数枚举类型或委托(delegate)。通过这种方式,上面的代码可以在没有任何装箱的情况下工作 - 并且它实际上一次性计算出枚举类型的所有“有趣”位,这是该类型第一次与 Unconstrained Melody 结合使用,因此此操作非常高效.
如果您不想使用 Unconstrained Melody,您可以编写自己的方法来查找枚举的“已使用位”一次,然后只需使用:
MyType t = UsedBitsOfMyType & ~mtGroup1;
关于c# - 使用 LINQ 进行标记枚举合并(组合的逆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11678389/