125

次のコードがあります。

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

ただし、値にインデックスを付けることができません。これを行う簡単な方法はありますか?

または、何かを完全に見逃したことがありますか。

4

13 に答える 13

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

しかし、GetNames が名前を返すのと同じ順序で GetValues が値を返すことを確信できますか?

于 2009-01-27T09:16:04.693 に答える
35

配列をキャストする必要があります - 返される配列は実際には要求された型myEnum[]ですtypeof(myEnum)

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

その後values[0]など

于 2009-01-27T09:17:14.957 に答える
10

その配列をさまざまなタイプの配列にキャストできます。

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

または整数値が必要な場合:

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

もちろん、これらのキャストされた配列を反復することができます:)

于 2009-01-27T09:21:08.927 に答える
8

辞書リストはどうですか?

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

もちろん、辞書の値の型を列挙型の値に変更できます。

于 2009-01-27T09:25:03.287 に答える
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;
  } 
}
于 2011-10-03T07:43:20.133 に答える
3

古い質問ですが、LINQ を使用した少しクリーンなアプローチ.Cast<>()

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

foreach(var val in values)
{
    Console.WriteLine("Member: {0}",val.ToString());     
}
于 2013-05-07T16:23:41.637 に答える
3

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
 */
于 2016-06-30T18:43:18.020 に答える
3

foreach ループを使用するのはどうですか?

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

そのようなものでしょうか?

于 2009-01-27T09:15:38.300 に答える
2

配列にはGetValue(Int32)メソッドがあり、これを使用して、指定したインデックスの値を取得できます。

Array.GetValue

于 2009-01-27T09:35:07.293 に答える
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 書式指定子は、列挙値を 10 進数として書式設定します。16 進数の出力を与える X 指定子もあります。

G 指定子は、列挙型を文字列としてフォーマットします。Flags 属性が列挙型に適用されている場合は、組み合わせた値もサポートされます。Flags が常に存在するかのように機能する F 指定子があります。

Enum.Format() を参照してください。

于 2012-10-12T17:00:56.497 に答える
0

カスタム Enum オブジェクトを反復処理する簡単な方法を次に示します。

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

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

Next
于 2009-09-11T21:27:19.083 に答える
0

古い質問ですが、3Dave の回答が最も簡単な方法でした。デバッグ用にデータベース内の列挙値をデコードするための Sql スクリプトを生成するための小さなヘルパー メソッドが必要でした。それはうまくいきました:

    public static string EnumToCheater<T>() {
        var sql = "";
        foreach (var enumValue in Enum.GetValues(typeof(T)))
            sql += $@"when {(int) enumValue} then '{enumValue}' ";
        return $@"case ?? {sql}else '??' end,";
    }

私は静的メソッドでそれを持っているので、使用法は次のとおりです。

var cheater = MyStaticClass.EnumToCheater<MyEnum>()
于 2018-08-01T00:06:10.843 に答える