【问题标题】:Casting IEnumerable<T> to List<T>将 IEnumerable<T> 转换为 List<T>
【发布时间】:2021-12-02 13:20:22
【问题描述】:

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

【问题讨论】:

    标签: c# list ienumerable


    【解决方案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();
      

      【讨论】:

        猜你喜欢
        • 2012-02-24
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多