查找列表中第二和第三大项的索引

时间:2017-09-21 01:44:37

标签: c# list

例如,我有一个列表:

List<double> Nums = new List<double> {12.32, 5.12, 7.64, 9.77, 4.98, 8};

如何找到列表中第二个和第三个最高双精度的索引? 结果将给出3(对于9.77)和5(对于8)。

重要的是值的顺序不会改变。我的其余代码取决于列表的顺序不变。

谢谢!

4 个答案:

答案 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索引。