【问题标题】:How to cast IEnumerable<IEnumerable<T>> to List<List<T>> [duplicate]如何将 IEnumerable<IEnumerable<T>> 转换为 List<List<T>> [重复]
【发布时间】:2016-01-08 11:57:56
【问题描述】:

可以投IEnumerable&lt;IEnumerable&lt;T&gt;&gt; to List&lt;List&lt;T&gt;&gt;吗?如果我这样做,我会得到一个无效的强制转换异常。

谢谢

【问题讨论】:

  • 所以你尝试过 MyEnumerable.ToList()?

标签: c# list ienumerable


【解决方案1】:

从集合到列表的简单转换使用ToList() 方法。示例:

var list = collection.ToList();

您可以使用 Linq 获取此结构中的所有列表,例如:

首先导入命名空间以使用Linq。

using System.Linq;

试试这个:

var list = collection.Select(c => c.ToList()) // convert each collection in a list
                     .Tolist(); //last ToList to get all conversions in a single list

list 对象将是 List&lt;List&lt;T&gt;&gt; 类型。

【讨论】:

  • 这是正确的,应该这样标记。
【解决方案2】:

不能强制转换,必须使用ToList()IEnumerable&lt;T&gt; 转换为List&lt;T&gt;

IEnumerable<IEnumerable<T>> input;
var result = input
    .Select(i => i.ToList())
    .ToList();

【讨论】:

    【解决方案3】:

    Resharper 给出了一个很好的建议:

    var castedList = (myEnum is List<List<T>>) ? 
        (List<List<T>>) myEnum : 
        myEnum.Select(x => (x is List<T>) ? x as List<T>: x.ToList())
    

    如果枚举已经是一个列表,这将删除对ToList 的过时调用。

    【讨论】:

    • 现在,如果你有一个 List>,你就不会像你有一个 IEnumerable> 那样做同样的事情。在第一种情况下,您返回对列表的引用,而在第二种情况下,您创建新列表。只有执行 myEnum.Select(x => x.ToList()).ToList() 才会制作所有内容的新副本。
    • @RuneGrimstad 据我了解,我们不需要新列表,如果其中的枚举已经是列表,我们可以对它们进行新的引用,为什么要创建新列表?
    • 我同意。我的观点是,这两条路径会做不同的事情。在一种情况下,您会获得参考资料,而在另一种情况下,您会获得新列表
    猜你喜欢
    • 2012-02-24
    • 2021-12-02
    • 2018-08-04
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多