我想获取枚举常量值作为整数列表。我是按照以下方式做到的
List<int> dayCodesList = Enum.GetValues(typeof(Days)).Cast<Days>().Select(d => Convert.ToInt32(d)).ToList();
还有其他更有效的替代方法来实现它吗?
根据问题(如果有),可能取决于性能和/或代码熟练度。如果没有说明,就很难解决您的问题。我假设你想要的东西比你尝试过的更短,或者确认你已经正确地适应了你需要的东西。
下面的代码确实为您提供了您想要的,List<int> 具有默认枚举值。问题是您不需要额外的Select; Cast 将明确通知编译器您打算自己进行转换。
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<int>,对此有一些好处。因为它返回一个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 |
您可以看到所有三种实现之间的巨大差异。