Array类和Enum.GetValues()的简单形式

Ale*_*sky 13 .net c#

我正在使用静态方法

Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)

当您需要做的只是枚举值时,此方法很有效,但由于某种原因,它返回一个非常简单的Array类形式. 我试图找到一种简单的方法将其返回值转换为更"正常"的集合类,如常规数组或List <>.

到目前为止,如果我想这样做,我必须枚举Enum.GetValues(typeof(SomeEnum))的输出; 并将它们逐个添加到List <>.

任何想法如何更干净地做到这一点?

回答:

关键是要投出返回结果 -

SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)

如果你需要一个List,那么jus将它包装在括号中并ToList,如下所示:

List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
Run Code Online (Sandbox Code Playgroud)

Meh*_*ras 8

如果您使用的是.NET 3.5,则还可以使用Cast<T>和ToList扩展方法.

IEnumerable<SomeEnum> enums = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以获得一个列表

List<SomeEnum> list =  Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
Run Code Online (Sandbox Code Playgroud)


Kon*_*rin 5

受到 Jon Skeet不受约束的旋律的启发,我想出了我更喜欢的版本:

public static class Enum<T>
    where T: struct
{
    static Enum()
    {
        Trace.Assert(typeof(T).IsEnum);
        Values = Array.AsReadOnly((T[])Enum.GetValues(typeof(T)));
    }

    public static readonly ReadOnlyCollection<T> Values;
}
Run Code Online (Sandbox Code Playgroud)

和用法:

var values = Enum<BindingFlags>.Values;
Run Code Online (Sandbox Code Playgroud)

好消息是这个版本在多次调用时运行速度更快,因为它不会每次都创建新数组。


Ale*_*sky 4

发现在这里你可以这样做:

SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)

如果您需要一个列表,只需在末尾使用 .ToList() ,如下所示:

List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
Run Code Online (Sandbox Code Playgroud)

或者如果你更喜欢这个:

List<SomeEnum> list2 = new List<SomeEnum>((SomeEnum[]) Enum.GetValues(typeof(SomeEnum)));
Run Code Online (Sandbox Code Playgroud)