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] ); } 

但是,我不能索引值。 有没有更简单的方法来做到这一点?

或者我完全错过了一些东西!

 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返回名称相同的顺序返回值吗?

你需要转换数组 – 返回的数组实际上是所需的types,即myEnum[]如果你要求typeof(myEnum)

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

然后values[0]

您可以将该数组转换为不同types的数组:

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

或者如果你想要的整数值:

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

你可以迭代那些铸造的数组当然:)

字典列表如何?

 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)); } 

当然,你可以改变字典值的types,无论你的枚举值是什么。

这是另一个。 我们需要为EnumValues提供友好名称。 我们使用System.ComponentModel.DescriptionAttribute为每个枚举值显示一个自定义的string值。

 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”

另一个有趣的可能性是:

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

使用foreach循环怎么样,也许你可以使用它?

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

也许这样的东西?

老问题,但使用LINQ的.Cast<>()稍微干净的方法

 var values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); foreach(var val in values) { Console.WriteLine("Member: {0}",val.ToString()); } 

数组有一个GetValue(Int32)方法,您可以使用它来检索指定索引处的值。

Array.GetValue

你可以使用格式化string来简化它。 我在使用消息中使用以下片段:

 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说明符,它提供了hex输出。

G说明符将一个枚举格式化为一个string。 如果Flags属性应用于枚举,那么也支持组合的值。 有一个F说明符,就好像Flags总是存在一样。

请参阅Enum.Format()。

在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 */ 

这是一个简单的方法来遍历你的自定义的枚举对象

 For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum)) Print([Enum].GetName(GetType(MyEnum), enumValue).ToString) Next