将 IEnumerable<T> 转换为 List<T>
Posted
技术标签:
【中文标题】将 IEnumerable<T> 转换为 List<T>【英文标题】:Casting IEnumerable<T> to List<T> 【发布时间】:2021-12-02 13:20:22 【问题描述】:我想知道是否可以将IEnumerable
转换为List
。除了将每个项目复制到列表中之外,还有其他方法吗?
【问题讨论】:
【参考方案1】:如前所述,使用yourEnumerable.ToList()
。它通过您的IEnumerable
进行枚举,将内容存储在新的List
中。您不一定要复制现有列表,因为您的 IEnumerable
可能会懒惰地生成元素。
这正是其他答案所暗示的,但更清楚。这是反汇编,因此您可以确定:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
if (source == null)
throw Error.ArgumentNull("source");
return new List<TSource>(source);
【讨论】:
如果 IEnumerable 不为 null 而是为空会抛出错误吗?【参考方案2】:using System.Linq;
使用 .ToList() 方法。在 System.Linq 命名空间中找到。
var yourList = yourEnumerable.ToList();
https://docs.microsoft.com/en-us/dotnet/api/system.linq?view=netcore-2.2
【讨论】:
如果使用 System.Linq 不可用 :)。这应该完全是公认的答案... 另外,如果它不可用,你可能忘记用它的yourEnumerable?.ToList();
中使用空条件运算符来考虑yourEnumerable
可能是null
的可能性?【参考方案3】:
正如其他人所建议的,只需在可枚举对象上使用 ToList()
方法:
var myList = myEnumerable.ToList()
但是,如果您实现 IEnumerable
interface 的对象没有 ToList()
方法,并且您会收到如下错误:
“IEnumerable”不包含“ToList”的定义
...您可能缺少System.Linq
namespace,因为该命名空间提供的 ToList()
method is an extension method 不是IEnumerable
接口本身的成员。
所以只需将命名空间添加到您的源文件中:
using System.Linq
【讨论】:
【参考方案4】:创建一个新的 List 并将旧的 IEnumerable 传递给它的初始化器:
IEnumerable<int> enumerable = GetIEnumerable<T>();
List<int> list = new List<int>(enumerable);
【讨论】:
无论如何都需要一份副本。【参考方案5】:不,你应该复制,如果你确定引用是对列表的引用,你可以这样转换
List<int> intsList = enumIntList as List<int>;
【讨论】:
如果您确定它是对列表的引用,您应该使用直接强制转换,这样如果您错了它会抛出异常。如果您认为它 可能 是 List另一个问题(异步调用)
异步调用可能是您的问题。如果您添加了 using System.Linq 语句,但仍然收到错误消息“不包含 'ToList' 的定义并且没有可访问的扩展方法...”,请仔细查看错误消息中的 Task 关键字。
原始调用(有效)
IEnumerable<MyDocument> docList = await _documentRepository.GetListAsync();
尝试使用 ToList(还是不行)
所以...如果你这样做了,但它不起作用
List<MyDocument> docList = await _documentRepository.GetListAsync().ToList();
使用括号
您实际上是在 Task
List<MyDocument> docList = (await _documentRepository.GetListAsync()).ToList();
【讨论】:
以上是关于将 IEnumerable<T> 转换为 List<T>的主要内容,如果未能解决你的问题,请参考以下文章
将 DataTable 转换为 IEnumerable<T>