【发布时间】:2021-12-02 13:20:22
【问题描述】:
我想知道是否可以将IEnumerable 转换为List。除了将每个项目复制到列表中之外,还有其他方法吗?
【问题讨论】:
标签: c# list ienumerable
我想知道是否可以将IEnumerable 转换为List。除了将每个项目复制到列表中之外,还有其他方法吗?
【问题讨论】:
标签: c# list ienumerable
如前所述,使用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);
}
【讨论】:
using System.Linq;
使用 .ToList() 方法。在 System.Linq 命名空间中找到。
var yourList = yourEnumerable.ToList();
https://docs.microsoft.com/en-us/dotnet/api/system.linq?view=netcore-2.2
【讨论】:
yourEnumerable?.ToList(); 中使用空条件运算符来考虑yourEnumerable 可能是null 的可能性?
正如其他人所建议的,只需在可枚举对象上使用 ToList() 方法:
var myList = myEnumerable.ToList()
但是,如果您实现 IEnumerable interface 的对象没有 ToList() 方法,并且您会收到如下错误:
“IEnumerable”不包含“ToList”的定义
...您可能缺少System.Linq namespace,因为该命名空间提供的 ToList() method is an extension method 不是IEnumerable 接口本身的成员。
所以只需将命名空间添加到您的源文件中:
using System.Linq
【讨论】:
创建一个新的 List 并将旧的 IEnumerable 传递给它的初始化器:
IEnumerable<int> enumerable = GetIEnumerable<T>();
List<int> list = new List<int>(enumerable);
【讨论】:
不,你应该复制,如果你确定引用是对列表的引用,你可以这样转换
List<int> intsList = enumIntList as List<int>;
【讨论】:
异步调用可能是您的问题。如果您添加了 using System.Linq 语句,但仍然收到错误消息“不包含 'ToList' 的定义并且没有可访问的扩展方法...”,请仔细查看错误消息中的 Task 关键字。
IEnumerable<MyDocument> docList = await _documentRepository.GetListAsync();
所以...如果你这样做了,但它不起作用
List<MyDocument> docList = await _documentRepository.GetListAsync().ToList();
您实际上是在 Task
List<MyDocument> docList = (await _documentRepository.GetListAsync()).ToList();
【讨论】: