12

重複
の可能性:列挙型を列挙する方法は?

私がそのような列挙を持っていると仮定します:

public enum Cars
{
    Audi = 0,
    BMW,
    Opel,
    Renault,
    Fiat,
    Citroen,
    AlfaRomeo,
}

オペルとシトロエンの間で繰り返す機会はありますか?これらの値をメソッドのパラメーターとして与えたいと思います。

4

3 に答える 3

13

これは機能します:

for(Cars car=Cars.Opel; car<=Cars.Citroen; car++)
{
  Console.WriteLine(car);
}

ただし、開始値が終了値よりも小さいことを確認する必要があります。

編集
開始と終了をハードコーディングせずにパラメーターとして指定する場合は、正しい順序で使用する必要があります。「オペル」と「シトロエン」を切り替えるだけでは、何も出力されません。

また、(コメントで述べられているように)基になる整数値にギャップやオーバーラップが含まれていてはなりません。幸い、自分で値を指定しない場合('= 0'も必要ありません)、これがデフォルトの動作になります。MSDNを参照してください:

列挙子リストの要素に値を指定しない場合、値は自動的に1ずつ増加します。

于 2012-05-08T13:17:11.523 に答える
2

次のコードを使用して、列挙型をループすることができます。

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

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

Opelから開始してCitroenに移動することがわかっている場合は、の開始値と終了値をi配列内の正しいインデックスに設定します。

これは次のようになります。

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

  int start = names.ToList().IndexOf("Opel");
  int end = names.ToList().IndexOf("Citroen") + 1;

  for (int i = start; i < end; i++)
  {
      Console.WriteLine(names[i] + ' ' + values[i]);
  }
于 2012-05-08T13:14:18.400 に答える
1

また、LINQの使用:

var values = (from e in Enum.GetValues(typeof(Cars)) as Cars[]
              where e >= Cars.Opel && e <= Cars.Citroen
              select e);
// the same as above, but using lambda expressions
// var values = (Enum.GetValues(typeof(Cars)) as Cars[]).Where(car => car >= Cars.Opel && car <= Cars.Citroen); 

foreach(Cars c in values) Console.WriteLine(c);
于 2012-05-08T13:21:17.740 に答える