2014-05-18 72 views
1

通常我可以通過它的有序位置(0,1,2,3 ...)在enum中解決每個項目,但是如果我已經創建了一個具有自定義值的枚舉(如下所示) ,仍然有辦法通過其聲明的順序來解決每個項目(例如,Off = 0,_5m = 1,_15m = 2等),而不是它的值?通過訂單地址自定義枚舉值

enum WaitTime { Off = 0, _5m = 5, _15m = 15, _30m = 30, _1h = 60, _2h = 120, _3h = 180, _6h = 360, _12h = 720, _1d = 1440, _2d = 2880 } 
+1

你是什麼意思「由它的秩序」?如果你能澄清這個問題真的會有所幫助,而且你對.NET或Java感興趣嗎?它們在枚舉處理方面*非常不同。 –

+0

感謝@JonSkeet澄清它好一點,並刪除了java標籤。 – Essential

回答

2

C#可以使用Enum.GetValues()方法。

它檢索指定的 枚舉中的常量值的數組。數組的元素按枚舉常量的二進制值 排序。

Array enumElementsInArray = Enum.GetValues(typeof(WaitTime)); 

int firstElement = enumElementsInArray[0]; 
int secondElement = enumElementsInArray[1]; 

但是要知道,它會通過自己的價值觀排序元素後返回阿雷。但是,當然,對於你的枚舉,它會按你的意願工作。

+0

啊,這好像會起作用,謝謝@Farhad! :) – Essential

+1

@Essential很高興它幫助。但是要知道,在按元素排序元素之後,它會返回aray。 –

0

(回答C#)

不會,例如, _5m轉換爲5,而不是1。

調用什麼「命令」是隱式轉換爲一個整數(在缺省情況下是0 ... N-1與N個值的枚舉)

enum WaitTime { Off = 0, _5m = 5, _15m = 15, _30m = 30, _1h = 60, _2h = 120, _3h = 180, _6h = 360, _12h = 720, _1d = 1440, _2d = 2880 } 

class Program 
{ 
    static void Main() 
    { 
     WaitTime wt = WaitTime._15m; 
     Console.WriteLine((int)wt); 
    } 
} 

將輸出15.

PS .:避免在聲明枚舉值時引用下劃線。

+0

只是好奇,爲什麼我應該避免'尾隨'(我認爲你的意思是領先?)強調?我不能用數字開始枚舉名稱,因此是下劃線。 – Essential

+1

是的領先的,拼寫錯誤的......我會說Wait5m,Wait30m或者可能使用封裝TimeSpan和開/關布爾類的類 – quantdev

1

這將是對所有類型的枚舉工作的一般方法:

public static T GetValueAt<T>(int idx) 
{ 
    var vals = Enum.GetValues(typeof(T)); 
    return (T)vals.GetValue(idx); 
} 

用法:

var value = GetValueAt<WaitTime>(2); //returns _15m