将 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 不可用 :)。这应该完全是公认的答案... 另外,如果它不可用,你可能忘记用它的 声明你的 IEnumerable。 非常简单明了,谢谢!也许在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 但您不确定,请使用“as”,也不是错误条件。然后测试结果是否为null。 也许添加一个 'if (intsList == null) intsList = new List(enumIntList);'如果它可能已经是一个'List',但在某些情况下它不是。【参考方案6】:

另一个问题(异步调用)

异步调用可能是您的问题。如果您添加了 using System.Linq 语句,但仍然收到错误消息“不包含 'ToList' 的定义并且没有可访问的扩展方法...”,请仔细查看错误消息中的 Task 关键字。

原始调用(有效)

IEnumerable<MyDocument> docList = await _documentRepository.GetListAsync();

尝试使用 ToList(还是不行)

所以...如果你这样做了,但它不起作用

List<MyDocument> docList = await _documentRepository.GetListAsync().ToList();

使用括号

您实际上是在 Task 上调用 ToList! 在你的 await 调用周围添加括号,像这样

List<MyDocument> docList = (await _documentRepository.GetListAsync()).ToList();

【讨论】:

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

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

将 DataTable 转换为 IEnumerable<T>

将 DataRowCollection 转换为 IEnumerable<T>

将数组转换为 IEnumerable<T>

将数组转换为 IEnumerable<T>

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