c# - 使用 LINQ 进行标记枚举合并(组合的逆)

标签 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
}

结果值 tC | 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/

相关文章:

c# - 我如何将代码更改为linq样式

c# - 是否允许在线程之间缓存/重用 Thread.GetNamedSlot?

c# - 如何根据子节点对 XDocument 父节点进行排序?

java - 枚举持续时间问题

c# - 类型转换类型的扩展方法

c# - 动态 linq :Creating an extension method that produces JSON result

c# - 使用 Autofac 为同一类中的内部方法编写 Moq 单元测试

c# - 加入 Rx 流

sql-server - 如何使用 List 参数编译 LINQ 查询?

c# - System.Text.Json - 将第三方枚举数组序列化为字符串数组