2012-10-27 63 views
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甚至自定義結構?

+0

老實說,我不知道你想達到什麼樣的這裏。 – Oded

+0

我希望能夠使用枚舉進行語法分析(使用一組定義的符號)。這意味着Symbol.A和Symbol.B可以用來構造一個在'Production'枚舉中定義的單詞。但是我提出的實現不允許構建'Production.BA'。希望能清楚一點。 – MonkeyCoder

+0

附註:用[Flags]裝飾的Enums應該是複數形式。正常的枚舉應該是單數化的。 SO參考http://stackoverflow.com/questions/1405851/enum-naming-convention-plural – Silvermind

回答

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 
    } 
+0

我認爲這是最接近我想達到的目標,最後我跳過了使用枚舉,因爲它們在這種特殊情況下不會很好地運行。謝謝! – MonkeyCoder

0

您正在嘗試執行pattern matching。這不是枚舉的目的。像F#這樣的語言有一個很好的機制可以做到這一點,例如:

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

但是C#沒有這個[yet]。有一個很棒的項目可以將一個庫添加到C#中,爲其提供稱爲Functional C#的功能。我認爲圖書館是你最好的選擇。

0

當你想保持約兩者的價值和posititon信息,你需要在不同的位置使用不同的價值觀不同的枚舉值:

[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 
}