我的代码中定义了以下枚举:
[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
甚至自定义结构?
答案 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
}