私はこの配列を持っています:
float[] sizeEdge = new float[12,43,556,98];
私の質問は一部の人にとってはナイーブに思えるかもしれませんが、私は .NET に慣れていないので、最大数の配列インデックスを取得する必要があります。
どうすれば実装できますか?
前もって感謝します。
IEnumerable.Max()
次のような方法を使用できます。
一連の値の最大値を返します。
float[] sizeEdge = new float[] { 12f, 43f, 556f, 98f };
int maxIndex = Array.IndexOf(sizeEdge, sizeEdge.Max());
Console.WriteLine(sizeEdge[maxIndex]);
結果は次のようになります。
556
ここにDEMO
.
これは機能するはずです。に一般化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()
これは、両方を使用した場合のように 2 回ではなく、1 回だけ配列をトラバースする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;
}
の代替バージョンを使用できます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();