【问题标题】:How to loop through all enum values in C#? [duplicate]如何遍历 C# 中的所有枚举值? [复制]
【发布时间】:2010-11-01 14:52:54
【问题描述】:

这个问题在这里已经有了答案:
How do I enumerate an enum in C#? 26 个答案

public enum Foos
{
    A,
    B,
    C
}

有没有办法循环遍历Foos 的可能值?

基本上?

foreach(Foo in Foos)

【问题讨论】:

    标签: c# .net enums language-features


    【解决方案1】:

    是的,您可以使用 ‍GetValue‍‍‍s 方法:

    var values = Enum.GetValues(typeof(Foos));
    

    或打字版本:

    var values = Enum.GetValues(typeof(Foos)).Cast<Foos>();
    

    我很久以前就在我的私人库中添加了一个辅助函数来解决这种情况:

    public static class EnumUtil {
        public static IEnumerable<T> GetValues<T>() {
            return Enum.GetValues(typeof(T)).Cast<T>();
        }
    }
    

    用法:

    var values = EnumUtil.GetValues<Foos>();
    

    【讨论】:

    • 可以直接投射数组:(T[])Enum.GetValues(typeof(T))
    • @ŞafakGür 评论的好处是 (1) 您不必通过额外的迭代器 (.Cast&lt;Foos&gt;),并且 (2) 您不需要将所有值并再次拆箱。只要不将返回的数组类型更改为其他类型(如object[]),Şafak 的强制转换将保持有效。但我们可以完全确定它们不会,因为 (a) 它会失去性能,(b) 已经有数百万条代码行使用 Şafak 的演员表,它们都会因运行时异常而中断。
    • 当然,有多少枚举将包含十几个或两个值?我想在大多数情况下,装箱/拆箱的影响可以忽略不计,因此最干净的解决方案是最高优先级。
    • @JCoombs 我觉得这很干净:public static IReadOnlyList&lt;T&gt; GetValues&lt;T&gt;() { return (T[])Enum.GetValues(typeof(T)); }。但是,是的,在常见用法中性能差异可以忽略不计。当我已经有一个可迭代(可枚举)对象要返回时,我只是不喜欢创建迭代器的想法。
    • 不幸的是,这并不能回答提出的问题。问题是如何遍历枚举的值。 SLaks 回答了这个问题。
    【解决方案2】:

    是的。在System.Enum 类中使用GetValues() 方法。

    【讨论】:

      【解决方案3】:
      static void Main(string[] args)
      {
          foreach (int value in Enum.GetValues(typeof(DaysOfWeek)))
          {
              Console.WriteLine(((DaysOfWeek)value).ToString());
          }
      
          foreach (string value in Enum.GetNames(typeof(DaysOfWeek)))
          {
              Console.WriteLine(value);
          }
          Console.ReadLine();
      }
      
      public enum DaysOfWeek
      {
          monday,
          tuesday,
          wednesday
      }
      

      【讨论】:

        【解决方案4】:

        更新
        一段时间后,我看到一条评论让我回到原来的答案,我想我现在会采取不同的做法。这些天我会写:

        private static IEnumerable<T> GetEnumValues<T>()
        {
            // Can't use type constraints on value types, so have to do check like this
            if (typeof(T).BaseType != typeof(Enum))
            {
                throw new ArgumentException("T must be of type System.Enum");
            }
        
            return Enum.GetValues(typeof(T)).Cast<T>();
        }
        

        【讨论】:

        • 为什么使用 LINQ “更正确”?请参考You can cast the array directly: (T[])Enum.GetValues(typeof(T))@SafakGür,这个版本的 IMO 开销更少。
        • 让它变得简单 GetEnumValues() where T : Enum
        • @SaboorAwan 无法使用 System.Enum 作为类型参数约束。编译器说:Constraint cannot be special class 'Enum'
        • 是的,这就是为什么我在我的实现中有那个注释和类型检查的东西;我早就想到了。 :)
        • 快速注释。在 C# 7.3 中,您现在可以使用 Enum(以及 unmanageddelegate)作为通用约束。
        【解决方案5】:
        foreach(Foos foo in Enum.GetValues(typeof(Foos)))
        

        【讨论】:

        • 这是一个很好的解决方案。通过使用“Foos”而不是“var”,类型推断系统能够使用返回正确对象类型的正确版本的 GetValues。不错!
        • @RobertPatterson 通过使用Foos,没有任何东西可以神奇地推断出来。这是一个明确的演员表。
        • @daveD 我想人们可以自己编写一个 foreach 块。
        • @RobertPatterson var 2019 年在这里工作。
        【解决方案6】:
        foreach (Foos foo in Enum.GetValues(typeof(Foos)))
        {
            ...
        }
        

        【讨论】:

          【解决方案7】:
           Enum.GetValues(typeof(Foos))
          

          【讨论】:

            【解决方案8】:
            foreach (EMyEnum val in Enum.GetValues(typeof(EMyEnum)))
            {
               Console.WriteLine(val);
            }
            

            感谢 Jon Skeet:http://bytes.com/groups/net-c/266447-how-loop-each-items-enum

            【讨论】:

              猜你喜欢
              • 2023-03-03
              • 2010-09-14
              • 2015-08-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-12
              相关资源
              最近更新 更多