.jpg)
enum
网友回答:
更简单的方法:
Enum.GetValues(typeof(SomeEnum))
.Cast<SomeEnum>()
.Select(v => v.ToString())
.ToList();

网友回答:
这将返回 Num 的所有值。IEnumerable<SomeEnum>
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
如果您希望它是 ,只需在 之后添加 。List<SomeEnum>.ToList().Cast<SomeEnum>()
要在数组上使用 Cast 函数,您需要在 using 部分中具有 。System.Linq

网友回答:
简短的回答是,使用:
(SomeEnum[])Enum.GetValues(typeof(SomeEnum))
如果你需要一个局部变量,它是 .var allSomeEnumValues = (SomeEnum[])Enum.GetValues(typeof(SomeEnum));
为什么语法是这样的?!
该方法是在旧的 .NET 1.0 时代引入的。它返回运行时类型的一维数组。但由于它是一种非泛型方法(泛型直到 .NET 2.0 才引入),因此它不能声明其返回类型(编译时返回类型)。staticGetValuesSomeEnum[]
.NET 数组确实具有一种协方差,但由于将是一种值类型,并且由于数组类型协方差不适用于值类型,因此它们甚至无法将返回类型声明为 or 。(这与例如.NET 1.0的重载不同,后者具有编译时返回类型,但实际上返回了一个类型数组,其中必须是引用类型。SomeEnumobject[]Enum[]GetCustomAttributesobject[]SomeAttribute[]SomeAttribute
因此,.NET 1.0 方法必须将其返回类型声明为 。但我向你保证这是一个.System.ArraySomeEnum[]
每次使用相同的枚举类型再次调用时,它都必须分配一个新数组并将值复制到新数组中。这是因为数组可能由方法的“使用者”写入(修改),因此它们必须创建一个新数组以确保值不变。.NET 1.0 没有良好的只读集合。GetValues
如果您需要所有值的列表,请考虑只调用一次并将结果缓存在只读包装器中,例如:GetValues
public static readonly ReadOnlyCollection<SomeEnum> AllSomeEnumValues
= Array.AsReadOnly((SomeEnum[])Enum.GetValues(typeof(SomeEnum)));
然后你可以多次使用,同一个集合可以安全地重复使用。AllSomeEnumValues
为什么不好用.演员<SomeEnum>()?
很多其他答案都使用.这样做的问题是它使用了类的非泛型实现。这应该涉及将每个值装箱到一个框中,然后使用该方法再次取消所有这些值的装箱。幸运的是,该方法似乎在开始迭代集合之前检查其参数(参数)的运行时类型,因此它毕竟不是那么糟糕。事实证明,允许相同的数组实例通过。.Cast<SomeEnum>()IEnumerableArraySystem.ObjectCast<>.Cast<>IEnumerablethis.Cast<>
如果遵循 或 ,如:.ToArray().ToList()
Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList() // DON'T do this
您还有另一个问题:在调用时创建一个新集合(数组),然后使用该调用创建一个新集合 ()。因此,这是整个集合的一个(额外)冗余分配来保存值。GetValuesList<>.ToList()
更新:自 .NET 5.0(从 2020 年开始)起,上述信息已过时;终于有了一个泛型方法(从 2 年开始在 .NET Framework 0.2005 中引入了泛型),所以现在你应该简单地使用:
Enum.GetValues<SomeEnum>()
其返回参数为强类型(如 )。SomeEnum[]
模板简介:该模板名称为【如何在 C# 中将枚举转换为列表?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。