【问题标题】:Iterate Between Enum Values in C# [duplicate]在 C# 中的枚举值之间迭代 [重复]
【发布时间】:2012-05-16 23:29:25
【问题描述】:

可能重复:
How to enumerate an enum?

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

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

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

【问题讨论】:

  • var cars = Enum.GetValues(typeof (Cars)).Cast<int>().Where(i => i>=(int)Cars.Opel && i<=(int)Cars.Citroen).Cast<Cars>();
  • 避免对这种枚举使用枚举。例如,如果有人插入一个值,它就会引入维护噩梦。你的软件最终会支持其他汽车似乎是相当合理的。

标签: c# enumeration


【解决方案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);

【讨论】:

  • 如果枚举为每个值定义了整数,那么您可以知道这会起作用,但是您依赖于未定义的行为来实现枚举。 -1.
  • 如果 OP 要求提供通用解决方案,我会同意你的看法。然而,他没有,所以我没有。
【解决方案2】:

这将起作用:

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

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

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

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

当您没有为枚举器列表中的元素指定值时,这些值会自动递增 1。

【讨论】:

  • @NikhilAgrawal 是的,它会的。枚举值在底层是一个整数(默认情况下)。我测试了它(在 LinqPad 中),它运行良好。
  • 这取决于您知道Enum 的最小值和最大值,并且它还假设枚举形成一个连续的整数范围。对我投反对票。如果范围不连续,它就不起作用(想想enum Foo { A = 1, B = 17 })。
  • @Jason - 感谢您对否决票的解释(我想知道)。我知道这取决于订购等,这就是“开始少于结束”评论的原因。
  • @Hans Kesting:不仅仅是订购。这也是您假设这些值形成一个连续的序列;他们不需要,如果他们不这样做,这个循环就不会产生正确的值。
  • @Servy - 如果您没有为枚举值定义值,那么默认情况下,它们从第一个定义的值开始为零,并且对于后续值是“另一个”。见msdn.microsoft.com/en-us/library/cc138362.aspx,它定义的行为。
【解决方案3】:

您可以使用以下代码循环遍历枚举:

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

【讨论】:

  • 如果枚举为每个值定义了整数,那么您可以知道这会起作用,但是您依赖于未定义的行为来实现枚举。 -1.
  • @Servy 问题指出第一个值为零,默认情况下这些值是连续的。当然,如果您更改默认行为,这将不起作用,但张贴者不会这样做。
猜你喜欢
  • 1970-01-01
  • 2018-03-21
  • 2011-10-24
  • 2013-06-17
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多