0

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

[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甚至自定义结构?

4

3 回答 3

2

好吧,因为您需要注意 A 和 B 的顺序,而不是使用一些不可交换的操作。我最好建议每个位置都应该具有指定权重的方法,并且您可以简单地添加带有权重的符号。由于Enums 是ints 您可以为每个位置分配 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
    }
于 2012-10-27T15:49:19.540 回答
0

您正在尝试执行模式匹配。这不是枚举的用途。诸如 F# 之类的语言有一个很好的内置机制来执行此操作,例如:

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

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

于 2012-10-27T16:15:00.443 回答
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
}
于 2012-10-27T17:09:23.080 回答