我想知道是否可以将IEnumerable转换为List。除了将每个项目复制到列表中之外,还有什么方法可以做到吗?
答案 0 :(得分:36)
如上所述,请使用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);
}
答案 1 :(得分:30)
//使用System.Linq;
使用.ToList()方法。在System.Linq命名空间中找到。
var yourList = yourEnumerable.ToList();
https://docs.microsoft.com/en-us/dotnet/api/system.linq?view=netcore-2.2
答案 2 :(得分:7)
正如其他人所建议的那样,只需在可枚举对象上使用ToList()
方法:
var myList = myEnumerable.ToList()
但是,如果您的IEnumerable
对象没有ToList()
方法,并且您收到如下错误:
&#39; IEnumerable的&#39;不包含&#39; ToList&#39;
的定义
你可能错过了System.Linq
命名空间,所以只需添加它:
using System.Linq
答案 3 :(得分:1)
创建一个新List并将旧的IEnumerable传递给它的初始值设定项:
IEnumerable<int> enumerable = GetIEnumerable<T>();
List<int> list = new List<int>(enumerable);
答案 4 :(得分:0)
不,你应该复制,如果你确定该引用是对列表的引用,你可以像这样转换
List<int> intsList = enumIntList as List<int>;
答案 5 :(得分:-1)
异步调用可能是您的问题。如果您添加了 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();