Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数组类和Enum.GetValues()的简单形式_C#_.net - Fatal编程技术网

C# 数组类和Enum.GetValues()的简单形式

C# 数组类和Enum.GetValues()的简单形式,c#,.net,C#,.net,我正在使用静态方法 Enum.GetValues(typeof(SomeEnum)); 当您只需要枚举值时,此方法非常有效,但由于某些原因,它返回非常简单的数组类形式。我试图找到一种简单的方法,将它的返回值转换成一个更“正常”的集合类,如常规数组或列表 到目前为止,如果我想这样做,我必须通过Enum.GetValues(typeof(SomeEnum))的输出进行枚举;并将它们逐个添加到列表中 有没有办法更干净地完成这项工作 回答: 关键是转换返回结果-- 如果您需要列表,请将其括在括号中,并

我正在使用静态方法

Enum.GetValues(typeof(SomeEnum));
当您只需要枚举值时,此方法非常有效,但由于某些原因,它返回非常简单的数组类形式。我试图找到一种简单的方法,将它的返回值转换成一个更“正常”的集合类,如常规数组或列表

到目前为止,如果我想这样做,我必须通过Enum.GetValues(typeof(SomeEnum))的输出进行枚举;并将它们逐个添加到列表中

有没有办法更干净地完成这项工作

回答:

关键是转换返回结果--

如果您需要列表,请将其括在括号中,并按如下方式列出:

List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
List List=((SomeEnum[])Enum.GetValues(typeof(SomeEnum))).ToList();
这个怎么样:

    List<SomeEnum> list = new List<SomeEnum>();
    foreach (SomeEnum value in Enum.GetValues (typeof (SomeEnum)))
    {
        if (condition)
            list.Add(value);
    }
List List=新列表();
foreach(Enum.GetValues中的SomeEnum值(typeof(SomeEnum)))
{
如果(条件)
列表。添加(值);
}
修订版(2009年9月12日至美国东部时间下午2:20):

因此,我昨晚提出这个建议的基础是
Enum.GetValues
返回一个
数组
,我认为
Array
实现了
IEnumerable

我相信你可以构建一个
List
传递任意
IEnumerable
作为参数输入到构造函数中。 所以你应该能够做到这一点:

List<SomeEnum> values = new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)));
SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
当然,回想起来,GordonG并不是死心塌地想要得到一个
列表,这意味着他自己选择
SomeEnum[]
的答案也同样不错。

我可以这样做:

List<SomeEnum> values = new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)));
SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
如果需要列表,只需在末尾使用.ToList(),如下所示:

List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
List List=((SomeEnum[])Enum.GetValues(typeof(SomeEnum))).ToList();
或者如果你更喜欢这个:

List<SomeEnum> list2 = new List<SomeEnum>((SomeEnum[]) Enum.GetValues(typeof(SomeEnum)));
List list2=新列表((SomeEnum[])Enum.GetValues(typeof(SomeEnum));
这应该可以:

List<MyEnum> enums = ((MyEnum[])Enum.GetValues(typeof(MyEnum))).ToList();
List enums=((MyEnum[])Enum.GetValues(typeof(MyEnum))).ToList();

您在问题中发布的解决方案中,
ToList()
不起作用的原因是您在浇铸部分周围缺少一组paren。希望这有帮助

如果您使用的是.NET3.5,还可以使用
Cast
和ToList扩展方法

IEnumerable<SomeEnum> enums = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
IEnumerable enums=Enum.GetValues(typeof(SomeEnum)).Cast();
如果你愿意,你也可以得到一份清单

List<SomeEnum> list =  Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
List List=Enum.GetValues(typeof(SomeEnum)).Cast().ToList();
受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;
}
公共静态类枚举
其中T:struct
{
静态枚举()
{
Assert(typeof(T).IsEnum);
Values=Array.AsReadOnly((T[])Enum.GetValues(typeof(T));
}
公共静态只读只读只读集合值;
}
使用方法:

var values = Enum<BindingFlags>.Values;
var值=枚举值;
好的是,这个版本对于多个调用来说工作得更快,因为它不会每次都在上创建新的数组。

我有一个可以帮助实现这一点的方法。它可以返回强类型数组或不可变列表中的值:

SomeEnum[] array = Enums<SomeEnum>.GetValuesArray()
IList<SomeEnum> list = Enums<SomeEnum>.GetValues();
SomeEnum[]数组=Enums.GetValuesArray()
IList list=Enums.GetValues();
它是泛型的,并且对类型参数有一个约束,以确保它确实是一个枚举。这在普通的C#中是不可能的,但是库做了一些秘密工作使其工作。我更喜欢第二种形式,因为我们缓存列表——它不可变的事实意味着我们可以一次又一次地返回相同的引用

还有各种其他实用程序方法可以使使用标志枚举等更容易

享受.NET framework 2.0的更新解决方案(来自“Konstantin Spirin”):

public static class Enum<T> where T : struct
{
    static Enum()
    {
        Trace.Assert(typeof(T).IsEnum);
    }

    public static ReadOnlyCollection<T> Values = new ReadOnlyCollection<T>(((T[])Enum.GetValues(typeof(T))));
}
公共静态类枚举,其中T:struct
{
静态枚举()
{
Assert(typeof(T).IsEnum);
}
public static ReadOnlyCollection Values=新的ReadOnlyCollection(((T[])Enum.GetValues(typeof(T));
}

这就是我已经拥有的:)我想我已经找到了一个更干净的解决方案。让我把它贴出来。好吧,下次你应该在你的问题中包括你已经有的东西。您最初表示需要一个逐个添加项目的解决方案…Igor,请重新阅读我的问题。我想知道一种方法,将Enum.GetValues()的返回值eof转换为ListOk数组,很抱歉。。。太早了:(你还可以创建一个列表,并为它的AddRange方法提供一个数组。老兄,你被选为一个甚至都不编译的东西!;)AddRange也不编译。丹,呵呵,那也不行。现在你明白我为什么问这个看似简单的问题了。Enum.GetValues()返回一些奇怪的古老数组形式。@GordonG:但在您的回答中,您正在强制转换到SomeEnum的数组,除非我弄错了,否则该数组应该实现IEnumerable?你有没有试过,但也没有编译?也许太晚了…有人花时间否决了这个问题。迷人的。他可能甚至不知道这比表面上看起来要复杂得多。我花时间投了反对票:)+1这个问题最终让我做了一点调查,并教会了我一些新的东西。(如果您感兴趣,我修改了我的答案,并提供了一些关于Array类的附加信息,您可能会发现这些信息很有用。)这个答案的原因是:List values=new List(Enum.GetValues(typeof(SomeEnum));没有编译是因为缺少(SomeEnum[])cast…啊,我在看你在原始问题末尾包含的代码(包括cast)。对不起!:)别担心,我只是在澄清:)嘿,乔恩,我看了你的链接。很酷,你找到了一种方法来调试编译器:)嘿,乔恩,我想下载源代码,所以我右键点击我的乌龟SVN并选择导入。然后进入:无约束旋律只读,这要求我登录。。。所以我尝试了以下方法:,同样的事情。。。我怎样才能得到soruce代码