我有这个数组:
float[] sizeEdge = new float[12,43,556,98];
也许我的问题看起来对某些人来说很幼稚但是,我是.NET的新手, 我需要获得最大数字的数组索引。
如何实施?
提前谢谢。
答案 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();