Як атрымаць індэкс самага вялікага ліку ў масіве?

У мяне гэты масіў:

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

Можа быць, маё пытанне здасца наіўным некаторыя з НУ, але Im больш новы ў .NET, Мне трэба, каб атрымаць індэкс масіва вялікага ліку.

Як гэта ажыццявіць?

Загадзя дзякуй.

1
Я судзімасць гэта: плаваць maxEdgeSize = sizeEdge.Max (); чым я кінуў праходзячы масіў з дапамогай калі() заяву для праверкі вялікага ліку. Але я шукаю нешта больш элегантнае.
дададзена аўтар Michael, крыніца
Ёсць шмат падыходаў, вы маглі б паспрабаваць. Што вы спрабавалі да гэтага часу, і як гэта было?
дададзена аўтар Jon Skeet, крыніца
Ёсць іншы падыход да вашага пытання, гэта залежыць ад таго, што ваш настаўнік хоча, каб ты. :)
дададзена аўтар jomsk1e, крыніца

7 адказы

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

Звярніце ўвагу, гэта будзе перабіраць масіў у два разы, і будзе згенеравана выключэнне, калі масіў пусты. Калі вам неабходна працаваць з імі, пятля, верагодна, чысцей. Можна стварыць метад пашырэння:

public static int IndexOfMax(this IEnumerable seq) where T : IComparable
{
    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(this IEnumerable seq) where T : IComparable
{
    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;
}
5
дададзена
float[] sizeEdge = new float[]{12f, 43f, 556f, 98f};
var result = Array.IndexOf(sizeEdge,sizeEdge.Max());
2
дададзена
float max = 0;
int key = 0;
for(int x=0;x
2
дададзена
Звярніце ўвагу, што гэта не будзе працаваць, калі альбо масіў пусты (вы будзеце мець ключ ад 0, які з'яўляецца несапраўдным) або калі ўсё адмоўна.
дададзена аўтар Jon Skeet, крыніца
Можа быць, вы павінны змяніць Int макс = 0; плаваць макс = float.MinValue;
дададзена аўтар Casperah, крыніца

Вы можаце выкарыстоўваць IEnumerable.Max() спосаб, як;

<�Р> Вяртае максімальнае значэнне ў паслядоўнасці значэнняў. </Р>
float[] sizeEdge = new float[] { 12f, 43f, 556f, 98f };
int maxIndex = Array.IndexOf(sizeEdge, sizeEdge.Max());
Console.WriteLine(sizeEdge[maxIndex]);

Вынік будзе;

556

Тут DEMO .

1
дададзена

Вы можаце выкарыстоўваць Linq.

Don't forget the using statement using System.Linq;

int indexOfMax = Array.IndexOf(sizeEdge, sizeEdge.Max());
1
дададзена

This should work; generalised to IEnumerable:

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

int IndexOfMax(IEnumerable 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() таму ён павінен быць некалькі хутчэй.

You can generalise this to types that implement IComparable like so:

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

int IndexOfMax(IEnumerable numbers) where T: IComparable
{
    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;
}
1
дададзена

Вы можаце выкарыстоўваць альтэрнатыўны варыянт выберыце .

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();
1
дададзена