关于枚举:在C#中的枚举值之间迭代

Iterate Between Enum Values in C#

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to enumerate an enum?

假设我有一个这样的枚举:

1
2
3
4
5
6
7
8
9
10
public enum Cars
{
    Audi = 0,
    BMW,
    Opel,
    Renault,
    Fiat,
    Citroen,
    AlfaRomeo,
}

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


这将起作用:

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

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

编辑如果没有对开始和结束进行硬编码,但将它们作为参数提供,则需要按正确的顺序使用它们。如果你只是切换"欧宝"和"雪铁龙",你将得不到输出。

此外(如注释中所述),基础整数值不得包含间隙或重叠。幸运的是,如果您自己不指定值(甚至不需要"=0"),这将是默认行为。参见MSDN:

When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1.


可以使用以下代码通过枚举循环:

1
2
3
4
5
6
7
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,那么您可以将EDOCX1的起始值和结束值设置为数组中的正确索引。

看起来像这样:

1
2
3
4
5
6
7
8
9
10
  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]);
  }


此外,使用LINQ:

1
2
3
4
5
6
7
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);