【问题标题】:Get enum constant values as list of integers获取枚举常量值作为整数列表
【发布时间】:2021-05-05 12:41:15
【问题描述】:

我有一个枚举如下:

enum Days
{
   Sunday,
   Monday,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday
}

我想获取枚举常量值作为整数列表。我是按照以下方式做到的

List<int> dayCodesList = Enum.GetValues(typeof(Days)).Cast<Days>().Select(d => Convert.ToInt32(d)).ToList();

还有其他更有效的替代方法来实现它吗?

【问题讨论】:

  • 已经有一个名为DayOfWeek的内置枚举。更短:Enum.GetValues(typeof(DayOfWeek)).Cast&lt;int&gt;().ToList()
  • @RickDavin Cast&lt;T&gt; 涉及拳击。 Enum.GetValues返回数组,可以像(DayOfWeek[])Enum.GetValues(typeof(DayOfWeek))一样直接转换成MyEnum[]

标签: c# list enums integer


【解决方案1】:

这将为您提供枚举中的整数列表

 var listOfIntegers = Enum.GetValues(typeof(Days)).Cast<int>().ToList();

【讨论】:

  • 是的,我在@RickDavin 的评论中注意到了这个替代品
  • 这正是我想要的
【解决方案2】:

你也可以使用 列出 dayCodesList = new List(); Array.ForEach(Enum.GetValues(),value => dayCodesList.Add((int)value));

在 .net# 5.0 您可以使用 GetValues 获得 Days[]。 var dayCodesList = Enum.GetValues().Select(d => Convert.ToInt32(d)).ToList(); 或者 Array.ConvertAll(Enum.GetValues(), value =>(int)value).ToList();

【讨论】:

    【解决方案3】:

    我想获取枚举常量值作为整数列表。我是按照以下方式做到的

    List<int> dayCodesList = Enum.GetValues(typeof(Days)).Cast<Days>().Select(d => Convert.ToInt32(d)).ToList();
    

    还有其他更有效的替代方法来实现它吗?

    根据问题(如果有),可能取决于性能和/或代码熟练度。如果没有说明,就很难解决您的问题。我假设你想要的东西比你尝试过的更短,或者确认你已经正确地适应了你需要的东西。

    下面的代码确实为您提供了您想要的,List&lt;int&gt; 具有默认枚举值。问题是您不需要额外的SelectCast 将明确通知编译器您打算自己进行转换。

     List<int> dayCodesList = Enum.GetValues(typeof(Days)).Cast<Days>().Select(d => Convert.ToInt32(d)).ToList();
    

    您可以完全删除 Select,现在留下看到 Sangeeth Answer

     List<int> dayCodesList = Enum.GetValues(typeof(Days)).Cast<int>().ToList();
    

    另一种选择是自己处理获取值。下面我使用一个使用扩展的静态类来完成此操作。

    using System;
    using System.Collections.Generic;
    using System.Reflection;
    
    public static class EnumHelper
        {
            public static IEnumerable<T> GetAllValues<T>(this Type @enum)
            {
                if (!@enum.IsEnum)
                    throw new ArgumentException("Type must be an enum");
    
                FieldInfo[] flds = @enum.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                foreach (FieldInfo fInfo in flds)
                {
                    yield return (T)Convert.ChangeType(fInfo.GetRawConstantValue(), typeof(T));
                }
            }
        }
    

    在上面,我使用Reflection 来获取与传入的枚举关联的所有字段。对于每个字段,我抓取RawConstantValue 并将其转换为请求的类型。

    要实现上述内容,您可以执行以下操作:

     var dayCodes = typeof(Days).GetAllValues<int>();
    

    这将返回一个IEnumerable&lt;int&gt;,对此有一些好处。因为它返回一个IEnumerable,所以它推迟执行直到需要它;它也不包含在一种类型中。例如你可以这样做:

     var dayCodesList = typeof(Days).GetAllValues<int>().ToList(); // returns a List<int>
     var dayCodesArray = typeof(Days).GetAllValues<int>().ToArray(); // returns an array of ints
     var dayCodesListString = typeof(Days).GetAllValues<string>().ToList(); // returns a List<string>
     
    

    在此期间,我决定在这篇文章中对不同的实现做一些基准测试,请在下面查看。

    原始实施 (OP)

    Method Mean Error StdDev
    OriginalSolution 2.011 μs 0.0372 μs 0.0690 μs

    Sangeeth 实施

    Method Mean Error StdDev
    SangeethSolution 1.655 μs 0.0330 μs 0.0682 μs

    编码器实现

    Method Mean Error StdDev
    CodexerSolution 9.876 ns 0.2718 ns 0.7799 ns

    您可以看到所有三种实现之间的巨大差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多