将数组转换为 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&lt;T&gt;() / .OfType&lt;T&gt;() 吗?【参考方案2】:

我认为后者是从前者继承的。

Enum.GetValues返回Array,实现了非泛型IEnumerable,所以需要加一个演员表:

public static IEnumerable<SomeType> AllEnums = Enum.GetValues(typeof(SomeType))
    .Cast<SomeType>()
    .ToList(); 

这适用于 LINQ,因为 Cast&lt;T&gt; 扩展方法是为非泛型 IEnumerable 接口定义的,而不仅仅是在 IEnumerable&lt;U&gt; 上。

编辑: 调用ToList() 可避免与延迟执行的LINQ 方法产生的IEnumerable&lt;T&gt; 多次遍历相关的低效率。谢谢 Marc 的精彩评论!

【讨论】:

这将在被访问时装箱和拆箱,注意。 注意Enum.GetValues的结果可以直接转换成IEnumerable&lt;SomeType&gt;,不用Cast&lt;&gt;

以上是关于将数组转换为 IEnumerable<T>的主要内容,如果未能解决你的问题,请参考以下文章

将 IEnumerable<Ienumerable<T>> 转换为 Dictionary<key,IEnumerable<T>>

将 IEnumerable<T> 转换为 List<T>

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

将 DataTable 转换为 IEnumerable<T>

将 DataRowCollection 转换为 IEnumerable<T>

如何将 IEnumerable<t> 或 IQueryable<t> 转换为 EntitySet<t>?