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はsであるためint、各位置に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 に答える