c# – 迴圈列舉型別
Possible Duplicate:
07000
我不知道是否可以做我想要做的事,但我想為什麼不這樣做.
我有例子列舉:
public enum Animals { Cat, Dog, ... }
我想做的是重複這個列舉.我想要這樣工作:
foreach( var type in Animals ) { Console.WriteLine( type.toString() ); }
輸出將為:
Cat Dog
可能嗎?我不想把每個專案放到一個數組中,然後迭代,我想直接在這個列舉上迭代.
編輯:請注意,在這個答案中,我將動物重新命名為動物.根據.NET約定,只有基於標誌的列舉應該有一個複數名稱.
您可以使用ofollow,noindex" target="_blank">
Enum.GetValues()
:
foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) { Console.WriteLine(type.toString()); }
如Dan的評論所述,如果您在foreach迴圈中使用顯式輸入,則不需要轉換:
foreach (Animal type in Enum.GetValues(typeof(Animal)) { Console.WriteLine(type.toString()); }
但是現在你不能儘早發現錯誤.例如:
foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) { Console.WriteLine(type.toString()); }
SomeEmptyEnum是(顯然)一個空的列舉型別.這裡GetValues將返回一個空的陣列型別為SomeEmptyEnum [].上面的程式碼只會檢查返回的陣列的每個成員是否是正確的型別,所以你不會發現問題.顯然,這不可能在現實生活中發生,但它顯示了程式碼的味道,這導致我改變結果 – 基本上我更喜歡處理強型別的集合.
或者,對於更加類似安全的方法,您可以使用我的Unconstrained Melody 庫:
foreach (var type in Enums.GetValues<Animal>()) { Console.WriteLine(type.ToString()); }
這裡,我的Enums.GetValues<T>()返回一個IList<T>,這意味著:
>沒有必要投下
>它實際上返回一個不可變的列表,所以它不需要每次建立一個新的集合,不同於標準的Enum.GetValues()
它也有一個通用約束強制T是一個列舉型別,所以你不能不小心用非列舉型別呼叫它,不同於Enum.GetValues()…
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/7010768/iterating-on-enum-type