如何获取数组中最大数字的索引?

时间:2013-06-04 08:09:30

标签: c# .net

我有这个数组:

float[] sizeEdge = new float[12,43,556,98];

也许我的问题看起来对某些人来说很幼稚但是,我是.NET的新手, 我需要获得最大数字的数组索引。

如何实施?

提前谢谢。

7 个答案:

答案 0 :(得分:5)

float max = sizeEdge.Max();
int maxIndex = Array.IndexOf(sizeEdge, max);

请注意,这将迭代数组两次,如果数组为空,将抛出异常。如果你需要处理这些,循环可能更清晰。您可以创建一个扩展方法:

public static int IndexOfMax<T>(this IEnumerable<T> seq) where T : IComparable<T>
{
    if(! seq.Any()) return -1;
    T max = seq.First();
    int maxIdx = 0;
    int idx = 1;

    foreach(T item in seq.Skip(1))
    {
        if(max.CompareTo(item) < 0)
        {
            max = item;
            maxIdx = idx;
        }
        ++idx;
    }

    return maxIdx;
}

或linq版本:

public static int IndexOfMax<T>(this IEnumerable<T> seq) where T : IComparable<T>
{
    return seq.Select((f, idx) => new { Val = f, Idx = idx })
        .Aggregate(new { Max = default(T), MaxIndex = -1 }, (mp, fp) =>
        {
            return mp.MaxIndex == -1 || fp.Val.CompareTo(mp.Max) > 0 ? new { Max = fp.Val, MaxIndex = fp.Idx } : mp;
        }).MaxIndex;
}

答案 1 :(得分:2)

float max = 0;
int key = 0;
for(int x=0;x<sizeEdge.Length;x++){
 if(max<sizeEdge[x]){
  max=sizeEdge;
  key=x;
 }
}

答案 2 :(得分:2)

float[] sizeEdge = new float[]{12f, 43f, 556f, 98f};
var result = Array.IndexOf(sizeEdge,sizeEdge.Max());

答案 3 :(得分:1)

您可以使用Linq。

不要忘记使用声明using System.Linq;

int indexOfMax = Array.IndexOf(sizeEdge, sizeEdge.Max());

答案 4 :(得分:1)

您可以使用IEnumerable.Max()方法;

  

返回值序列中的最大值。

float[] sizeEdge = new float[] { 12f, 43f, 556f, 98f };
int maxIndex = Array.IndexOf(sizeEdge, sizeEdge.Max());
Console.WriteLine(sizeEdge[maxIndex]);

结果将是;

556

这是DEMO

答案 5 :(得分:1)

这应该有用;推广到IEnumerable<float>

// Returns index of maximum value, or -1 if there are no numbers.

int IndexOfMax(IEnumerable<float> numbers)
{
    float max = 0;
    int indexOfMax = -1;
    int index = 0;

    foreach (var number in numbers)
    {
        if ((number > max) || (indexOfMax < 0))
        {
            indexOfMax = index;
            max = number;
        }

        ++index;
    }

    return indexOfMax;
}

这只会遍历数组一次,而不是像你使用.Max()IndexOf()那样两次,所以它应该更快一些。

您可以将此概括为实现IComparable<T>的类型,如下所示:

// Returns index of maximum value, or -1 if there are no numbers.

int IndexOfMax<T>(IEnumerable<T> numbers) where T: IComparable<T>
{
    T max = default(T);
    int indexOfMax = -1;
    int index = 0;

    foreach (var number in numbers)
    {
        if ((number.CompareTo(max) > 0) || (indexOfMax < 0))
        {
            indexOfMax = index;
            max = number;
        }

        ++index;
    }

    return indexOfMax;
}

答案 6 :(得分:1)

您可以使用select的替代版本。

float[] sizeEdge = new float[12,43,556,98];

var maxIndex = sizeEdge.Select((x,i) => new { value = x, index = i})
                       .OrderByDescending(x => x.value)
                       .Select(x=> x.index)
                       .FirstOrDefault();