迭代C#中的枚举值

时间:2012-05-08 13:12:24

标签: c# enumeration

  

可能重复:
  How to enumerate an enum?

假设我有一个类似的枚举:

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

我有机会在欧宝和雪铁龙之间进行迭代吗?我想将这些值作为方法的参数。

3 个答案:

答案 0 :(得分:12)

这将有效:

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

但您必须确保起始值小于结束值。

修改
如果您不对开始和结束进行硬编码,而是将它们作为参数提供,则需要按正确的顺序使用它们。如果您只是切换“欧宝”和“雪铁龙”,您将无法获得输出。

另外(如评论中所述)基础整数值不得包含间隙或重叠。幸运的是,如果你自己没有指定值(即使不需要'= 0'),这也是默认行为。见MSDN

  

如果未在枚举器列表中指定元素的值,则值将自动递增1.

答案 1 :(得分: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开始并转到雪铁龙,请将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]);
  }

答案 2 :(得分: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);