简化列表中的复杂c#列表

时间:2017-07-30 01:42:12

标签: c# list

我有一个

List<List<float>>

每个内部列表包含8个浮点值,值不同。目标是从内部列表中提取具有最大值的浮点的位置。最终结果将是一个包含所有这些整数的列表(表示位置1-8)。

我怎么能以有效的方式完成这项任务,这是我第一次尝试压缩这些数据而我不知道如何解决这个问题,因为浮点数在列表列表中的位置是值感兴趣的。

我在想,一种方法是先组合列表并创建一个函数,一次比较8个数字并完全创建一个新列表。我觉得这将是无效和缓慢的。

list = listOfList.SelectMany(x => x).ToList();
 ~function

2 个答案:

答案 0 :(得分:2)

以下是LINQ查询,它应该为您完成工作:

List<float> mylist1 = new List<float> { 1, 2 };
List<float> mylist2 = new List<float> { 3, 4 };
List<List<float>> mergedList = new List<List<float>> { mylist1, mylist2 };

//get the largest float inside each inner list and create a list
var maxOfAllInnerLists = mergedList.Select(x => x.IndexOf(x.Max()));

最终列表maxOfAllInnerLists包含{1,1}。

2中的最大元素mylist1的索引为14中的最大元素mylist2的索引再次为1。因此输出。

答案 1 :(得分:2)

当你说“高效”时,我不知道你的意思是代码最少还是最快。 @ RBT的答案或多或少是最少的代码,但程序代码通常比功能代码(即LINQ)更快。如果您正在寻找最快的代码,那么查看每个数字的速度要快得多,如下所示:

var maxList = new List<float>(); 
var positions = new List<int>(); //if you want to store their positions
foreach(List<float> l in myList){
    var max = Single.MINVALUE; //or 0 if they're all positive
    var count = 0;
    var pos = 0;
    foreach (float f in l){
        if(f > max){
            max = f;
            pos = count;
        }
        count++;
    }
    maxList.add(max);
    positions.add(pos);
}

当然,只有你的名单很大,速度才有意义。如果它们很小,则任何一种方法都将在几毫秒内完成。