C#通过枚举迭代?(索引System.Array)

TK.*_*TK. 109 c# iteration enums 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] ); 
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法索引值.有更简单的方法吗?

或者我完全错过了什么!

Fre*_*els 196

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

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

或者,您可以强制转换返回的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]);
}
Run Code Online (Sandbox Code Playgroud)

但是,你能确定GetValues以与GetNames返回名称相同的顺序返回值吗?

  • "但是,你能确定GetValues以与GetNames返回名称相同的顺序返回值吗?" - 这是一个非常好的观点,我还没有解决的问题!我认为你的第一个解决方案可能会提供一种可靠地匹配值和字符串的方法 (3认同)

Mar*_*ell 32

你需要强制转换数组 - 返回的数组实际上是所请求的类型,即myEnum[]如果你要求typeof(myEnum):

myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));
Run Code Online (Sandbox Code Playgroud)

然后values[0]


Arc*_*rus 9

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

myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));
Run Code Online (Sandbox Code Playgroud)

或者如果你想要整数值:

int[] values = (int[])Enum.GetValues(typeof(myEnum));
Run Code Online (Sandbox Code Playgroud)

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


mrt*_*ndi 7

字典列表怎么样?

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));
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将字典值类型更改为您的枚举值.


小智 5

另一个解决方案,有趣的可能:

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;
  } 
}
Run Code Online (Sandbox Code Playgroud)

  • 心理记录:使用产量更多 (3认同)