【问题标题】:List<double[][]> to List<double[]>列表<double[][]> 到列表<double[]>
【发布时间】:2013-09-03 11:04:04
【问题描述】:

我是一个 python 人,最近开始了一个 C# 项目。我的代码的一部分采用myList = List&lt;double[][]&gt;,需要将其转换为myNewList = List&lt;double[]&gt; 以传递给另一个函数。

所以假设myList 看起来像这样:

{{{0.0, 1.0}, {2.0, 3.0}}, {{4.0, 5.0}, {6.0, 7.0}}}

我希望myNewList 看起来像这样:

{{0.0, 1.0}, {2.0, 3.0}, {4.0, 5.0}, {6.0, 7.0}}

在 python 中,我会这样做:

myNewList = list(itertools.chain.from_iterable(myList))

现在,我可以很容易地使用foreach 循环来实现这一点,并将Adding 保持为myNewList,但是有人知道这样做的内置方法吗?

【问题讨论】:

    标签: c# arrays flatten


    【解决方案1】:

    更好地使用LINQ:

    var myNewList = myList.SelectMany(x=>x).ToList();
    

    【讨论】:

    • 这将为样本输入生成两个长度为的数组。 OP 想要四个长度为 2 的数组。
    • 这会产生一个包含 4 个元素数组的 2 元素列表。这是不正确的。
    • @Servy 对于 OP 的要求,我无法想象答案会如此简单,因为我更新(并且也测试了)。
    【解决方案2】:

    试试这个:

    myNewList.SelectMany(x => x.Select(y => y).ToArray()).ToList();
    

    这会给你一个List&lt;double[]&gt;

    【讨论】:

    • 我在 VS2012 中尝试了上面的代码,并给了我预期的结果。它给了我一个包含 4 个 double[] 的列表。也许我不明白这个问题???
    • +1 也对此进行了测试。它会产生完全期望的结果。
    【解决方案3】:

    您可以使用方法SelectMany 来“展平”列表。基本上,如果您有一个列表列表,它会将所有列表连接成一个。在这种情况下,您有一个 List&lt;double[][]&gt;,因此它嵌套了 3 次。

      List<double[]> flattenedList = myList.SelectMany(x => x.Select(y => y).ToArray()).ToList();
    

    会为你做的。第一个 Select 并没有真正做任何事情,我喜欢把它想象成一个 for 循环,把它读作“对于每个 x 做 x.SelectMany”,它需要向下一层到 double[][] 元素,因为这些确实是您要压扁的。

    【讨论】:

    • 这会产生一个包含 4 个元素数组的 2 元素列表。这是不正确的。
    • @lukegravitt 哦,我明白你在说什么......我想我没有足够仔细地查看预期的输出。我会修改答案。
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2021-01-27
    • 2021-10-23
    • 2021-02-21
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多