枚举组合和按位运算符

时间:2012-10-27 15:32:56

标签: c# enums

我的代码中定义了以下枚举:

[Flags]
public enum Symbol
{
    A,
    B,
}

public enum Production
{
    AA = Symbol.A | Symbol.A,
    AB = Symbol.A | Symbol.B,
    BA = Symbol.B | Symbol.A, // <- this will obviously not work
}

我计划使用enums,因为他们最终会阻止将不需要的Symbols用于Productions。问题是以下代码不会产生我之后的输出:

Productions product1 = (Productions) (Symbol.A | Symbol.A); // Production.AA
Productions product2 = (Productions) (Symbol.A | Symbol.B); // Production.AB
Productions product3 = (Productions) (Symbol.B | Symbol.A); // Production.AB (and not Production.BA as I would like)

我完全理解为什么会发生这种情况,但是想知道是否有一些按位运算符的组合,我可以使用它来使其按照我原先的意图工作?

或者一般情况下我试图以不正确的方式使用枚举,因此应切换到chars甚至自定义结构?

3 个答案:

答案 0 :(得分:2)

好吧,因为您需要处理A和B的顺序,而不是应该使用一些不可交换的操作。我最好建议每个位置应该具有指定权重的方法,并且可以简单地添加带权重的符号。由于Enum s是int s,您可以为每个位置分配权重10 ^ i,其中i是从右到左看的位置的从零开始的索引。即使这样,您也可以计算更多的符号。这与经典阿拉伯数字相似,但使用符号而不是常规数字。代码可以是这样的:

    [Flags]
    public enum Symbol
    {
        A,
        B,
    }

    public enum Production
    {
        AA = Symbol.A *10 + Symbol.A, //0
        AB = Symbol.A *10 + Symbol.B, //1
        BA = Symbol.B *10 + Symbol.A, //10
    }

答案 1 :(得分:0)

您正在尝试执行pattern matching。这不是enums的用途。诸如F#之类的语言具有内置的强大机制,例如:

match expression with 
| pattern_1 -> expression_1 
| pattern_2 -> expression_2 
| pattern_n -> expression_n

但是C#还没有这个。有一个很棒的项目可以向C#添加一个库,为它提供名为Functional C#的功能。我认为图书馆是你最好的选择。

答案 2 :(得分:0)

由于您希望保留有关值和位置的信息,您需要对不同位置的不同值使用不同的枚举值:

[Flags]
public enum Symbol {
  FirstA = 1,
  FirstB = 2,
  SecondA = 4,
  SecondB = 8
}

public enum Production {
  AA = Symbol.FirstA | Symbol.SecondA,
  AB = Symbol.FirstA | Symbol.SecondB,
  BA = Symbol.FirstB | Symbol.SecondA
}