将数组转换为IEnumerable <T>

Kon*_*ten 11 c# arrays ienumerable casting type-conversion

令我惊讶的是,我得到以下声明:

public static IEnumerable<SomeType> AllEnums 
  => Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)

抱怨无法从System.Array转换为System.Collection.Generic.IEnumerable.我以为后者继承了前者.显然我错了.

因为我不能LINQ它或.ToList它,我不知道如何妥善处理它.我宁愿避免显式转换,因为它是枚举的一堆值,我不认为SomeType -ing它会有很多用处,也不会.

Mar*_*ell 18

一般Array基类没有输入,因此它不实现任何特定于类型的接口; 但是,矢量可以直接投射 - GetValues实际上返回一个矢量; 所以:

public static IEnumerable<SomeType> AllEnums
    = (SomeType[])Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)

或者更简单:

public static SomeType[] AllEnums 
    = (SomeType[])Enum.GetValues(typeof(SomeType));
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

我认为后者继承了前者。

Enum.GetValuesreturns Array,它实现了非泛型IEnumerable,所以你需要添加一个强制转换:

public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
    .Cast<SomeType>()
    .ToList(); 
Run Code Online (Sandbox Code Playgroud)

这适用于 LINQ,因为Cast<T>扩展方法是为非通用IEnumerable接口定义的,而不仅仅是在IEnumerable<U>.

编辑:ToList()避免与多次行走相关的低效率调用,IEnumerable<T>并由具有延迟执行的 LINQ 方法生成。谢谢马克的精彩评论!