c# - C# 获取 List.Max 索引?

我有清单


List<double> nums = new List<double> {0.2, 5.0, 12.0};



我正在寻找 element-element^2 最大的元素。 我可以


nums.Max(num => num - Math.Pow(num, 2))



查找最大值,但如何获取这里元素的索引,这些元素标识为在评估时产生最大值。 num - Math.Pow(num, 2)IndexOf 将不起作用,因为 Max 返回的值不是实际值的值,而应用于整个表达式的值。

我已经看过获取最大元素的索引, 但是在它返回实际元素, 并因此IndexOf工作的情况下似乎覆盖了Max。 我只能想象,因为 Max 迭代了列表,所以有一个简单的方法来解决我的案例。

时间:

有时用一个好循环来做它会更容易


double maxValue = Double.MinValue;


int indexOfMax = -1;


for (int i = 0; i <nums.Count; i++) {


 double x = nums[i];


 double y = x - x * x;


 if (y> maxValue) {


 maxValue = y;


 indexOfMax = i;


 }


}


double element = nums[indexOfMax];



在一个Linq查询中( 虽然不能保证最好的性能)


List<double> nums = new List<double> { 0.2, 5.0, 12.0 };


var index = nums.Select((n, i) => new { Result = n - n * n, Index = i })


. Aggregate(new { Result = Double.MinValue, Index = -1 }, (a, b) => (a.Result> b.Result)? a : b)


. Index;



对列表进行解析的一种更有效的方法是创建自己的.Max() 扩展,然后在列表中调用它。


public static int MaxIndexByCustomRule(this IEnumerable<double> sequence)


 {


 int index = 0;


 int maxIndex = -1;


 double maxResult = double.MinValue;


 foreach (var value in sequence)


 {


 var tempResult = value - value * value;


 if (index == 0)


 {


 maxResult = tempResult;


 maxIndex = 0;


 index++;


 continue;


 }



 if (tempResult> maxResult)


 {


 maxResult = tempResult;


 maxIndex = index;


 }



 index++;


 }


 return maxIndex;


 }



调用:


List<double> nums = new List<double> { 0.2, 5.0, 12.0 };


nums.MaxIndexByCustomRule();



可以使用 Linq 。选择元素及其索引,并计算每个元素的值。 然后排序( 。按降序,在你的情况下) 并获取top元素。 代码相同的文本:


List<double> nums = new List<double> { 0.2, 5.0, 12.0 };



var index = nums.Select((d, i) => new {index = i, value = d - d * d})


. OrderByDescending(x => x.value)


. Take(1)


. Select(x => (int?) x.index)


. FirstOrDefault();



if (index == null)


 Console.WriteLine("nums is empty");


else


 Console.WriteLine($"index is {index}");



enter image description here

如果您打算捕获max元素的索引,我建议使用传统循环来使用本文中的第一个解决方案。 如果您仍想使用委托使用max函数,则可以执行此操作。

...