2014-10-31 96 views
2

我有以下的在我的代碼enum遍歷的標誌枚舉值 - 但保留順序

[Flags] 
public enum Column 
{ 
    FirstName = 1 << 0, 
    LastName = 1 << 1, 
    Address = 1 << 2, 
} 

現在我有可以採取enum的方法。

public void ParseColumns(Column col) 
{ 
    //do some parsing... 
} 

這種方法可以這樣調用:

ParseColumns(Column.FirstName | Column.LastName); 
ParseColumns(Column.LastName); 
ParseColumns(Column.LastName | Column.Address | Column.FirstName); 
ParseColumns(Column.Address | Column.FirstName); 

我現在需要通過值迭代,但保持在其中enum傳遞給方法的順序。

我發現以下方法給了我遍歷它們的可能性,但遺憾的是,它返回了在Enum本身中定義的順序,而不是我如何調用方法。 Iterate over values in Flags Enum?

+2

'Column.FirstName | Column.LastName'和'Column.LastName | Column.FirstName'的值完全相同。你所要求的就像撥打電話'Foo(1 + 1)'與'Foo(2)'有不同的表現。 – hvd 2014-10-31 14:07:03

+0

'ParseColumns()'只接收一個值(在你的情況下它將是'int'),它顯然不包含任何* order *信息。您將需要使用包含順序('List',數組等)或提供順序信息作爲另一個參數的合適類型(例如,'string'包含數字,''132「'將指定'FirstName'>''地址「>」姓氏「順序)。 – Sinatr 2014-10-31 14:17:32

回答

8

我現在需要遍歷值,但保持傳遞給方法的枚舉順序。

有沒有這樣的概念。 |運算符沒有任何保留排序的方法。換一種方式,想象一下我們有:

public void Foo(int x) 

和你把它稱爲:

Foo(1 + 4) 
Foo(2 + 3) 

你如何指望它來區分?如果您需要通過單獨的值,具有特定的保存順序,你應該使用:

public void ParseColumns(params Column[] columns) 

......此時,你可能希望避免它是一個標誌枚舉的。

3

這是根本不可能的。

標誌枚舉值通過添加單個項目的值(每個項目都是一個唯一的位)來工作。

加法是可交換的,因此不能說它們在加入順序。

考慮接受的非標誌枚舉值(params)陣列。

0

其不可能的,但一個有趣的,但不是很不錯的主意......

你可以做的是位移位結合的擴展方法(因爲運算符重載不工作)...序列化,然後去序列化值...仍然聽起來像一個壞主意,哈哈哈。

public static Column OR(this Column original, Column newc) { 
    return (Column) ((int)original)| (((int) newc) << 3) 
} 
public static Column Get(this Column original) { 
    // Some iterator that looks almost like the one you already have 
} 
public static Column GetOrder(this Column original) { 
    // Some iterator that looks almost like the one you already have 
} 

,那麼你可以調用這個如下

ParseColumns(Column.FirstName.OR(Column.LastName)) 

然後是implentation類似:

public void ParseColumns(Column col) 
{ 
    col.Get(); 
    col.GetOrder(); 
} 

檢查這樣的事情會適合你