49

我想知道是否可以将 anIEnumerable转换为List. 除了将每个项目复制到列表中之外,还有其他方法吗?

4

6 回答 6

61

如前所述,使用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);
}
于 2009-06-07T07:27:38.540 回答
43
using System.Linq;

使用 .ToList() 方法。在 System.Linq 命名空间中找到。

var yourList = yourEnumerable.ToList();

https://docs.microsoft.com/en-us/dotnet/api/system.linq?view=netcore-2.2

于 2009-06-07T07:10:38.590 回答
7

正如其他人所建议的,只需ToList()在可枚举对象上使用该方法:

var myList = myEnumerable.ToList()

但是,如果您实现IEnumerable接口的对象没有该ToList()方法并且您收到如下错误:

“IEnumerable”不包含“ToList”的定义

...您可能缺少System.Linqnamespace,因为该方法是该命名空间提供的扩展方法,它不是接口本身的成员。 ToList()IEnumerable

因此,只需将命名空间添加到您的源文件中:

using System.Linq
于 2017-08-03T02:50:57.593 回答
2

创建一个新的 List 并将旧的 IEnumerable 传递给它的初始化器:

    IEnumerable<int> enumerable = GetIEnumerable<T>();
    List<int> list = new List<int>(enumerable);
于 2009-06-07T07:13:02.407 回答
0

不,你应该复制,如果你确定引用是对列表的引用,你可以像这样转换

List<int> intsList = enumIntList as List<int>;
于 2009-06-07T07:12:06.370 回答
-1

另一个陷阱(异步调用)

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

原始电话(作品)

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

尝试使用 ToList(仍然无法正常工作)

所以......如果你这样做并且它不起作用

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

使用括号

您实际上是在 Task<IEnumerable> 上调用 ToList!像这样在您的等待调用周围添加括号

List<MyDocument> docList = (await _documentRepository.GetListAsync()).ToList();
于 2021-02-24T16:45:25.493 回答