我有清单
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
返回的值不是应用时会产生最大值的实际元素的值,而是整个表达式的值。
我看过Obtain the Index of the Maximum Element,但是在返回实际元素从而Max
有效的情况下,它似乎涵盖了IndexOf
。我只能想象有一种简单的方法可以解决我的问题,因为Max
无论如何都会迭代列表。
答案 0 :(得分:4)
有时候,使用一个好的旧循环会更容易
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];
答案 1 :(得分:3)
在一个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 (tempResult > maxResult)
{
maxResult = tempResult;
maxIndex = index;
}
index++;
}
return maxIndex;
}
致电:
List<double> nums = new List<double> { 0.2, 5.0, 12.0 };
nums.MaxIndexByCustomRule();
答案 2 :(得分:1)
您可以使用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}");
答案 3 :(得分:-3)
private static int index = -1;
private static double value = Double.MinValue;
[TestMethod]
public void MaxTest()
{
List<double> nums = new List<double> { 0.2, 5.0, 12.0 };
var x = nums.Max(num => Transform(num));
}
public double Transform(double n)
{
var r = n - Math.Pow(n, 2);
if (r > value)
{
value = r;
index++;
}
return r;
}
如果您打算捕获max元素的索引,我建议通过传统循环使用本文中的第一个解决方案。如果您仍然想通过委托使用max函数,可以执行以下操作。