将IEnumerable <t>转换为List <t> </t> </t>

时间:2009-06-07 07:07:41

标签: c# list

我想知道是否可以将IEnumerable转换为List。除了将每个项目复制到列表中之外,还有什么方法可以做到吗?

6 个答案:

答案 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();

尝试使用 ToList(仍然无效)

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

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

使用括号

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

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