例如,我有一个列表:
List<double> Nums = new List<double> {12.32, 5.12, 7.64, 9.77, 4.98, 8};
如何找到列表中第二个和第三个最高双精度的索引? 结果将给出3(对于9.77)和5(对于8)。
重要的是值的顺序不会改变。我的其余代码取决于列表的顺序不变。
谢谢!
答案 0 :(得分:2)
你可以这样做:
var numbers = Nums.OrderByDescending(x => x).Skip(1).Take(2); // this will get collection of second and third highest element
var secondHighestIndex = Nums.FindIndex(x => x == numbers.First()); // will get second highest index
var thirdHighestIndex = Nums.FindIndex(x => x == numbers.Last());// will get third highest index
答案 1 :(得分:1)
你也可以这样做:
List<double> Nums = new List<double> { 12.32, 5.12, 7.64, 9.77, 4.98, 8 };
var lst = Nums.Select((a, b) => new KeyValuePair<int, double>(b, a))
.OrderByDescending(c => c.Value).Skip(1).Take(2).ToList();
我创建了keyvalue对,使用其值作为值,将index作为键。然后按其值排序,然后跳过第一个结果,然后取2个结果。
结果对将是:
[0] {[3, 9.77]}
[1] {[5, 8]}
您可以通过索引访问它:
lst[0].Key; //For Index - 3
lst[0].Value; //For Value - 9.77
答案 2 :(得分:0)
逐步解决方案
List<double> Nums = new List<double> { 12.32, 5.12, 7.64, 9.77, 4.98, 8 };
var SMax = Nums.OrderByDescending(z => z).Skip(1).First();
var Tmax = Nums.OrderByDescending(z => z).Skip(2).First();
var SIndex = Nums.IndexOf(SMax);
var TIndex = Nums.IndexOf(Tmax);
答案 3 :(得分:0)
您可以使用linq,如@Keyur PATEL's comment中所述。稍作修改可以在一个声明中为您提供这两个数字:Nums.OrderByDescending(n => n).Skip(1).Take(2);
请参阅@Akash KC的答案。
另一个解决方案是遍历数组,将每个元素与找到的最高元素进行比较,并将3个最高数字的索引保存为有限长度的堆栈,并在完成之后忽略最高值:< / p>
var highest = Nums[0];
var topIndexes = new int[3];
for(int i=1; i<Nums.length; i++){
if(Nums[i]>highest){
topIndexes [2] = topIndexes [1]; //Record index of 3rd highest
topIndexes [1] = topIndexes [0]; //Record index of 2nd highest
topIndexes [0] = i; //Record index of highest
highest = Nums[i];
}
}
//Do something with topIndexes[1] (2nd highest number's index)
//and topIndexes[2] (3rd highest number's index)
上面的代码可以很容易地修改为一个函数/方法,用于动态地从集合中查找或获取最高n
个数字或n
索引。