我有一个
List<List<float>>
每个内部列表包含8个浮点值,值不同。目标是从内部列表中提取具有最大值的浮点的位置。最终结果将是一个包含所有这些整数的列表(表示位置1-8)。
我怎么能以有效的方式完成这项任务,这是我第一次尝试压缩这些数据而我不知道如何解决这个问题,因为浮点数在列表列表中的位置是值感兴趣的。
我在想,一种方法是先组合列表并创建一个函数,一次比较8个数字并完全创建一个新列表。我觉得这将是无效和缓慢的。
list = listOfList.SelectMany(x => x).ToList();
~function
答案 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
的索引为1
。
4
中的最大元素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);
}
当然,只有你的名单很大,速度才有意义。如果它们很小,则任何一种方法都将在几毫秒内完成。