【问题标题】:iterating on enum type [duplicate]迭代枚举类型[重复]
【发布时间】:2011-10-24 01:22:05
【问题描述】:

可能重复:
How do I enumerate an enum?

我不知道是否可以做我想做的事,但我想为什么不可以。

我有示例枚举:

public enum Animals {
    Cat,
    Dog,
    ...
}

我想要做的是迭代这个枚举。我希望它像这样工作:

foreach( var type in Animals ) {
    Console.WriteLine( type.toString() );
}

输出将是:

 Cat
 Dog

有可能吗?我不想把每一项都放到一个数组中,然后迭代,我想直接在这个枚举上迭代。

【问题讨论】:

  • 我注意到您问“我不想将每个项目都放入一个数组中,然后进行迭代”,但提供的所有答案都涉及一个包含所有值的数组。这很重要吗?
  • 答案对我很好。我不想手动放入项目。如果它有一些语言结构,这对我来说是一个很好的解决方案。

标签: c# enums iteration


【解决方案1】:

编辑:请注意,在整个答案中,我已将 Animals 重命名为 Animal。根据 .NET 约定,只有基于标志的枚举应该有复数名称。

你可以使用Enum.GetValues():

foreach (var type in (Animal[]) Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

如 Dan 的评论中所述,如果您在 foreach 循环中使用显式输入,则无需强制转换:

foreach (Animal type in Enum.GetValues(typeof(Animal)) {
    Console.WriteLine(type.toString());
}

但现在您不会尽早发现错误。例如:

foreach (Animal type in Enum.GetValues(typeof(SomeEmptyEnum)) {
    Console.WriteLine(type.toString());
}

SomeEmptyEnum (显然)是一个空的枚举类型。这里GetValues 将返回一个SomeEmptyEnum[] 类型的空数组。上面的代码只会检查 返回数组的每个成员 是否属于正确的类型,因此您不会发现问题。显然这在现实生活中不太可能发生,但它展示了导致我转换结果的那种代码味道——基本上我更喜欢处理强类型集合。


或者,对于更安全的方法,您可以使用我的 Unconstrained Melody 库:

foreach (var type in Enums.GetValues<Animal>()) {
    Console.WriteLine(type.ToString());
}

这里我的Enums.GetValues&lt;T&gt;() 返回一个IList&lt;T&gt;,这意味着:

  • 无需投射
  • 它实际上返回一个不可变的列表,所以它不需要每次都创建一个新的集合,不像标准的Enum.GetValues()

它还有一个通用约束,强制T 成为枚举类型,所以你不能不小心用非枚举类型调用它,不像Enum.GetValues()...

【讨论】:

  • +1 用于执行代码分析命名约定。
【解决方案2】:

Enum.GetValues 是你的朋友。

【讨论】:

    【解决方案3】:

    使用Enum.GetNames() 循环遍历枚举成员的名称。使用Enum.GetValues() 循环遍历这些值。

    【讨论】:

      【解决方案4】:

      要节省输入 Jon's answer 的部分内容,请明确指定类型,您不必强制转换:

      foreach (Animal a in Enum.GetValues(typeof(Animal)) {
          Console.WriteLine(a);
      }
      

      不过,这也需要像explained by Jon 那样格外小心。

      另请注意,C# 枚举名称通常应为单数形式(Animal,而不是 Animals),除非它们标有允许组合的 [Flags] 属性。

      【讨论】:

      • 已将此纳入我的回答中,并对为什么这实际上并不安全进行了一些额外的评论。
      • 没问题 - 我想我以前没有考虑过。我想我们也在同时编辑命名约定:)
      【解决方案5】:

      试试这个:

          enum animals
          {
              cat,
              dog,
              fish
          }
      
          private void Form1_Load(object sender, EventArgs e)
          {
              foreach (string myAnimal in Enum.GetNames(typeof(animals)))
              {
                  Debug.WriteLine(myAnimal);
              }
          }
      

      您必须遍历 Enum.Getnames(typeof(yourEnum))。

      祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        • 2011-02-07
        • 2018-03-21
        • 1970-01-01
        • 2020-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多