在 List<List<double[]>> 中合并一些 List<double[]>

Posted

技术标签:

【中文标题】在 List<List<double[]>> 中合并一些 List<double[]>【英文标题】:Merging some List<double[]> within a List<List<double[]>> 【发布时间】:2015-09-21 08:40:20 【问题描述】:

我正在努力尝试以特定方式合并列表列表。我想要做的如下所述。

我的输入列表是:

列表 A = List&lt;List&lt;double[]&gt;&gt;

列表 B = List&lt;int[]&gt;

而期望的输出是:

列表 C = List&lt;List&lt;double[]&gt;&gt;

我想要合并列表 A 中的一些 List&lt;double[]&gt;(例如,使用 linq 中的联合功能)并将结果列表存储在名为“ListC”的 List&lt;List&lt;double[]&gt;&gt; 中。

要在 ListA 中合并的 List 的索引存储在 ListB 中。如果不应该合并元素(它们的索引没有出现在 ListB 中),那么我们直接将它们添加到 ListC。

示例

输入

ListA = new List<List<double[]>>()  a0, a1, a2, a3, a4, a5; 

其中 ai = List&lt;double[]&gt;

ListB = new List<int[]>()  new int[]0,1,2, new int[]3,5 ; 

表示列表 0-1-2 必须合并为一个。与列表 3-5 相同

输出:ListC = List&lt;List&lt;double[]&gt;&gt;包含了List A所有合并的List&lt;double[]&gt;以及唯一的List&lt;double[]&gt;。即:

--> c0= union of a0, a1, a2 "三个要合并为1的列表"

--> c1= union of a3, a5 "两个列表合并为2"

--> c2= a4 "是唯一列表"

注意:重复不是问题。

什么是实现这一目标的好方法?

代码:

using System;
using System.Collections.Generic;
using System.Linq;


class _unionLists


    public static void Main(string[] args)
    

        #region input lists
        //--------------------LIST A---------------------------------------------------
        //List a0
        var point1 = new double[]  3, 3, 0 ;
        var point2 = new double[]  9, 6, 0 ;
        var point3 = new double[]  12, 8, 0 ;
        var point4 = new double[]  18, 8, 0 ;
        List<double[]> a0 = new List<double[]>()  point1, point2, point3, point4 ;

        //List a1
        var point5 = new double[]  3, 3, 0 ;
        var point6 = new double[]  9, 7, 0 ;
        var point7 = new double[]  15, 7, 0 ;
        var point8 = new double[]  21, 15, 0 ;
        List<double[]> a1 = new List<double[]>()  point5, point6, point7, point8 ;

        //List a2
        var point9 = new double[]  20, 13, 0 ;
        var point10 = new double[]  22, 16, 0 ;
        List<double[]> a2 = new List<double[]>()  point9, point10 ;

        //List a3
        var point11 = new double[]  15, 19, 0 ;
        var point12 = new double[]  27, 19, 0 ;
        List<double[]> a3 = new List<double[]>()  point11, point12 ;

        //List a4
        var point13 = new double[]  18, 20, 0 ;
        var point14 = new double[]  21, 19, 0 ;
        List<double[]> a4 = new List<double[]>()  point13, point14 ;

        //List a5
        var point15 = new double[]  27, 19.5, 0 ;
        var point16 = new double[]  30, 5, 0 ;
        List<double[]> a5 = new List<double[]>()  point15, point16 ;          

        var ListA = new List<List<double[]>>()  a0, a1, a2, a3, a4, a5;

        //--------------------LIST B---------------------------------------------------
        var ListB = new List<int[]>()  new int[]0,1,2 , new int[]3,5 ;

        #endregion

        //There are some of the List<double[]> within List A that I want to merge (e.g. using  the Union capability in linq) and store the resultant list in a List<List<double[]>> called "ListC".
        //The indices of the Lists to be merged within ListA are stored in the ListB. If the elements are not suposed to be merged (their index doesn't appear in ListB) then we add them directly to ListC.
        //
        //Example: 
        //  Inputs: ListA = new List<List<double[]>>()  a0, a1, a2, a3, a4, a5; where ai=List<double[]>;
        //          ListB = new List<int[]>()  new int[]0,1,2 , new int[]3,5 ; indicates that the lists 0-1-2 have to be merged into one. Same with lists 3-5
        //  Output: ListC= List<List<double[]>> contains all the merged List<double[]> as well as all the unique List<double[]> of List A. That is:
        //          c0= union of a0, a1, a2 "three lists to be merged into 1"
        //          c1= union of a3, a5 "two lists to be merged into 2"
        //          c2= a4 "is a unique list"

        var ListC = new List<List<double[]>>();


    

【问题讨论】:

您实际尝试过什么?您看起来好像在这里拥有所有设置代码,但我看不出您实际上在哪里尝试进行合并?你的问题到底出在哪里?你能想出一个算法来做到这一点吗?您是否有无法实现的算法?还有什么? 创建一个更准确地表示您的数据的数据结构可能是值得的。我不确定这是否应该是矩阵或多维数组或其他东西,但是如果您编写了一个类来表示它,那将更容易考虑需要对数据应用哪些转换。 @Asad 同意 - 人脑不擅长跟踪嵌套数据结构,最好给它们赋予一些含义 【参考方案1】:

试试这个:

var elementsACount = ListA.Count();
var groupedElementsIdxs = ListB.SelectMany(e => e);
var ungroupedElementsIdxs = Enumerable.Range(0, elementsACount).Except(groupedElementsIdxs);

var result = new List<List<double[]>>();
// Merge and add the grouped elements.
foreach (var el in ListB)

    result.Add(el.Select(e => ListA[e]).SelectMany(e => e).ToList());

// Merge and add the ungrouped elements.
result.Add(ungroupedElementsIdxs.Select(e => ListA[e]).SelectMany(e => e).ToList());

【讨论】:

@Jodrell 在我使用问题中给出的数据对其进行测试时,它既可以编译又可以工作。此外,您的答案包含一些阻止其编译的语法错误,但我看到您已修复它。 @Jodrell 您正在针对错误的数据结构对其进行测试。请参阅问题:var ListA = new List&lt;List&lt;double[]&gt;&gt;() a0, a1, a2, a3, a4, a5; 在您的代码中您针对List&lt;double[]&gt; 而不是List&lt;List&lt;double[]&gt;&gt; 进行测试。 @Jodrell 是的,你写错了。 listA 的类型错误。这反过来会从Select 中产生一个错误类型的可枚举,然后当您尝试将ToList 传递给Add 时会出现类型不匹配错误。 @Asad,你说的都是对的,这是你的代码工作的演示。 ideone.com/gBfWRk【参考方案2】:
var result = new List<List<double[]>>();

foreach (var array in listB)

    var ld = new List<double[]>();
    foreach (var index in array)
    
        ld.Concat(listA[index]);
    

    result.Add(ld);


var indices = listB.SelectMany(arr => arr);

result.AddRange(listA.Where((list, index) => !indices.Contains(index)));

【讨论】:

【参考方案3】:

你可以写

var C = A.SelectMany(x => x).Union(B);

【讨论】:

以上是关于在 List<List<double[]>> 中合并一些 List<double[]>的主要内容,如果未能解决你的问题,请参考以下文章

将 java List<Double> 传递给 dart List<double> 时出错

用 List<Double> 预测

java中arrylist怎么存储double

未处理的异常:类型“List<dynamic>”不是“List<Map<String, double>>”类型的子类型

是否有将 List<int> 转换为 Double 的 Dart 函数?

Visifire图表