将数组转换为 IEnumerable<T>
Posted
技术标签:
【中文标题】将数组转换为 IEnumerable<T>【英文标题】:Converting Array to IEnumerable<T> 【发布时间】:2015-02-28 21:43:43 【问题描述】:令我惊讶的是,我得到以下声明:
public static IEnumerable<SomeType> AllEnums
=> Enum.GetValues(typeof(SomeType));
抱怨无法从 System.Array 转换为 System.Collection.Generic.IEnumerable。我认为后者是从前者继承的。显然我错了。
由于我不能 LINQ 或 .ToList 它,我不确定如何正确处理它。我宁愿避免显式强制转换,因为它是 enum 的一堆值,我不认为 as SomeType -ing 它会有很大用处,也.
【问题讨论】:
Enum.GetValues
返回一个非强类型的Array
。所以这里不足为奇。
【参考方案1】:
一般的Array
基类是没有类型的,所以它没有实现任何类型特定的接口;但是,vector 可以直接转换 - 而GetValues
实际上返回一个向量;所以:
public static IEnumerable<SomeType> AllEnums
= (SomeType[])Enum.GetValues(typeof(SomeType));
或者更简单:
public static SomeType[] AllEnums
= (SomeType[])Enum.GetValues(typeof(SomeType));
【讨论】:
有没有办法用数组类型而不是枚举来做到这一点? @toughQuestions 它应该适用于任何协变数组类型(并非所有数组) - 你有具体的例子吗? 不确定我应该把它放在评论部分,但说你有方法“IEnumerable CheckRange(IEnumerable value)”。该方法需要检查和限制“价值”。因此,如果我们将“值作为数组”转换,然后修改值,那么我将无法“GetValues”并将其作为 IEnumerable 作为您的建议返回。谢谢 @toughQuestions 你在找.Cast<T>()
/ .OfType<T>()
吗?【参考方案2】:
我认为后者是从前者继承的。
Enum.GetValues
返回Array
,实现了非泛型IEnumerable
,所以需要加一个演员表:
public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
.Cast<SomeType>()
.ToList();
这适用于 LINQ,因为 Cast<T>
扩展方法是为非泛型 IEnumerable
接口定义的,而不仅仅是在 IEnumerable<U>
上。
编辑: 调用ToList()
可避免与延迟执行的LINQ 方法产生的IEnumerable<T>
多次遍历相关的低效率。谢谢 Marc 的精彩评论!
【讨论】:
这将在被访问时装箱和拆箱,注意。 注意Enum.GetValues
的结果可以直接转换成IEnumerable<SomeType>
,不用Cast<>
以上是关于将数组转换为 IEnumerable<T>的主要内容,如果未能解决你的问题,请参考以下文章
将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>
无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”
将 DataTable 转换为 IEnumerable<T>