我有这个数组:
float[] sizeEdge = new float[12,43,556,98];
也许我的问题对某些人来说似乎很幼稚,但是,我是 .NET 的新手,我需要获取最大数字的数组索引。
我该如何实施?
先感谢您。
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;
}
float max = 0;
int key = 0;
for(int x=0;x<sizeEdge.Length;x++){
if(max<sizeEdge[x]){
max=sizeEdge;
key=x;
}
}
float[] sizeEdge = new float[]{12f, 43f, 556f, 98f};
var result = Array.IndexOf(sizeEdge,sizeEdge.Max());
您可以使用 Linq。
不要忘记 using 语句using System.Linq;
int indexOfMax = Array.IndexOf(sizeEdge, sizeEdge.Max());
您可以使用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()
,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();