2009-01-27 45 views
99

我有以下代碼:C#遍歷一個枚舉? (索引一個的System.Array)

// Obtain the string names of all the elements within myEnum 
String[] names = Enum.GetNames(typeof(myEnum)); 

// Obtain the values of all the elements within myEnum 
Array values = Enum.GetValues(typeof(myEnum)); 

// Print the names and values to file 
for (int i = 0; i < names.Length; i++) 
{ 
    print(names[i], values[i]); 
} 

然而,我不能索引值。有沒有更簡單的方法來做到這一點?

或者我完全錯過了一些東西!

+0

你可能想看看[C#枚舉的來龍去脈(http://www.codeducky.org/ins-outs-c-enums/),其中介紹瞭如何獲得一個類型的IEnumerable 使用GetValues()和Cast() – ChaseMedallion 2014-07-20 20:09:31

回答

179
Array values = Enum.GetValues(typeof(myEnum)); 

foreach(MyEnum val in values) 
{ 
    Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val)); 
} 

或者,你可以投返回的的System.Array:

string[] names = Enum.GetNames(typeof(MyEnum)); 
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum)); 

for(int i = 0; i < names.Length; i++) 
{ 
    print(names[i], values[i]); 
} 

但是,可以肯定的是在GetValues方法相同的順序GetNames返回名稱返回值是多少?

+3

「但是,你能確定GetValues以與GetNames返回名稱相同的順序返回值嗎?」 - 這是一個非常好的點,我還沒有解決!我認爲你的第一個解決方案可能會提供一種方法來可靠地匹配值和字符串 – 2009-01-27 09:22:50

+0

你好,我在這樣做之前就已經提到了這種懷疑「索引不匹配」的情況;然而,我還沒有發現這是否真的是一個問題?是否有任何明確的情況下,這種假設可能會出錯?謝謝! – Funka 2009-08-31 23:11:19

+0

如果你想排除像Enum.GetName(typeof(MyEnum),val),(int)val)那樣的值不匹配問題,你可能想要把第二個「val」轉換爲int值,其中輸出提供了枚舉姓名和號碼。 – Greg 2013-07-15 20:14:24

3

如何使用foreach循環,也許你可以使用它?

int i = 0; 
    foreach (var o in values) 
    { 
    print(names[i], o); 
    i++; 
    } 

也許這樣的事情?

+0

我有那麼多......但我需要訪問'同步'中的名稱和值...說名稱[2]與值[2]和我不確定如何在foreach循環中實現這一點! – 2009-01-27 09:17:08

+0

我已經添加了一個例子 - 看看是否有幫助。 – TWith2Sugars 2009-01-27 09:20:58

30

你需要轉換陣列 - 返回數組實際上是請求的類型,即myEnum[]如果你問typeof(myEnum)

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum)); 

然後values[0]

8

你可以施放該數組不同數組類型:

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum)); 

或者如果您想要整數值:

int[] values = (int[])Enum.GetValues(typeof(myEnum)); 

可以遍歷當然這些鑄造陣列:)

6

怎麼樣詞典列表?

Dictionary<string, int> list = new Dictionary<string, int>(); 
foreach(var item in Enum.GetNames(typeof(MyEnum))) 
{ 
    list.Add(item, (int)Enum.Parse(typeof(MyEnum), item)); 
} 

當然,您可以將字典值類型更改爲任何枚舉值。

2

數組有一個GetValue(Int32)方法,您可以使用它來檢索指定索引處的值。

Array.GetValue

0

這裏有一個簡單的方法,通過自定義來遍歷枚舉對象

For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum)) 

    Print([Enum].GetName(GetType(MyEnum), enumValue).ToString) 

Next 
4

這裏是另一個。我們需要爲我們的EnumValues提供友好名稱。我們使用System.ComponentModel.DescriptionAttribute爲每個枚舉值顯示一個自定義的字符串值。

public static class StaticClass 
{ 
    public static string GetEnumDescription(Enum currentEnum) 
    { 
     string description = String.Empty; 
     DescriptionAttribute da; 

     FieldInfo fi = currentEnum.GetType(). 
        GetField(currentEnum.ToString()); 
     da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, 
        typeof(DescriptionAttribute)); 
     if (da != null) 
      description = da.Description; 
     else 
      description = currentEnum.ToString(); 

     return description; 
    } 

    public static List<string> GetEnumFormattedNames<TEnum>() 
    { 
     var enumType = typeof(TEnum); 
     if (enumType == typeof(Enum)) 
      throw new ArgumentException("typeof(TEnum) == System.Enum", "TEnum"); 

     if (!(enumType.IsEnum)) 
      throw new ArgumentException(String.Format("typeof({0}).IsEnum == false", enumType), "TEnum"); 

     List<string> formattedNames = new List<string>(); 
     var list = Enum.GetValues(enumType).OfType<TEnum>().ToList<TEnum>(); 

     foreach (TEnum item in list) 
     { 
      formattedNames.Add(GetEnumDescription(item as Enum)); 
     } 

     return formattedNames; 
    } 
} 

在使用

public enum TestEnum 
{ 
     [Description("Something 1")] 
     Dr = 0, 
     [Description("Something 2")] 
     Mr = 1 
} 



    static void Main(string[] args) 
    { 

     var vals = StaticClass.GetEnumFormattedNames<TestEnum>(); 
    } 

這將結束返回 「有事1」, 「某事2」

4

另一種解決方案,以有趣的可能性:

enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } 

static class Helpers 
{ 
public static IEnumerable<Days> AllDays(Days First) 
{ 
    if (First == Days.Monday) 
    { 
    yield return Days.Monday; 
    yield return Days.Tuesday; 
    yield return Days.Wednesday; 
    yield return Days.Thursday; 
    yield return Days.Friday; 
    yield return Days.Saturday; 
    yield return Days.Sunday; 
    } 

    if (First == Days.Saturday) 
    { 
    yield return Days.Saturday; 
    yield return Days.Sunday; 
    yield return Days.Monday; 
    yield return Days.Tuesday; 
    yield return Days.Wednesday; 
    yield return Days.Thursday; 
    yield return Days.Friday; 
    } 
} 
2

可以簡化這使用格式字符串。我在使用消息中使用以下片段:

writer.WriteLine("Exit codes are a combination of the following:"); 
foreach (ExitCodes value in Enum.GetValues(typeof(ExitCodes))) 
{ 
    writer.WriteLine(" {0,4:D}: {0:G}", value); 
} 

D格式說明符將枚舉值格式化爲小數。還有一個提供十六進制輸出的X說明符。

G說明符將枚舉格式化爲一個字符串。如果Flags屬性應用於枚舉,那麼也支持組合值。有一個F說明符,就好像Flags總是存在一樣。

請參閱Enum.Format()。

3

老問題,但使用LINQ的.Cast<>()

var values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 

foreach(var val in values) 
{ 
    Console.WriteLine("Member: {0}",val.ToString());  
} 
2

在Enum.GetValues結果稍微更簡潔的方法,鑄造INT產生的數值。使用ToString()會產生友好的名字。不需要其他對Enum.GetName的調用。

public enum MyEnum 
{ 
    FirstWord, 
    SecondWord, 
    Another = 5 
}; 

// later in some method 

StringBuilder sb = new StringBuilder(); 
foreach (var val in Enum.GetValues(typeof(MyEnum))) { 
    int numberValue = (int)val; 
    string friendyName = val.ToString(); 
    sb.Append("Enum number " + numberValue + " has the name " + friendyName + "\n"); 
} 
File.WriteAllText(@"C:\temp\myfile.txt", sb.ToString()); 

// Produces the output file contents: 
/* 
Enum number 0 has the name FirstWord 
Enum number 1 has the name SecondWord 
Enum number 5 has the name Another 
*/