获取List.Max的索引?

时间:2019-04-16 19:03:27

标签: 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返回的值不是应用时会产生最大值的实际元素的值,而是整个表达式的值。

我看过Obtain the Index of the Maximum Element,但是在返回实际元素从而Max有效的情况下,它似乎涵盖了IndexOf。我只能想象有一种简单的方法可以解决我的问题,因为Max无论如何都会迭代列表。

4 个答案:

答案 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函数,可以执行以下操作。