1

我有这个数组:

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

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

我该如何实施?

先感谢您。

4

7 回答 7

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;
}
于 2013-06-04T08:12:37.927 回答
2
float max = 0;
int key = 0;
for(int x=0;x<sizeEdge.Length;x++){
 if(max<sizeEdge[x]){
  max=sizeEdge;
  key=x;
 }
}
于 2013-06-04T08:11:17.247 回答
2
float[] sizeEdge = new float[]{12f, 43f, 556f, 98f};
var result = Array.IndexOf(sizeEdge,sizeEdge.Max());
于 2013-06-04T08:15:23.137 回答
1

您可以使用 Linq。

不要忘记 using 语句using System.Linq;

int indexOfMax = Array.IndexOf(sizeEdge, sizeEdge.Max());
于 2013-06-04T08:12:36.637 回答
1

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

返回值序列中的最大值。

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

结果将是;

556

这里一个DEMO.

于 2013-06-04T08:17:02.460 回答
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;
}
于 2013-06-04T08:22:11.287 回答
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();
于 2013-06-04T08:49:12.420 回答