C#找到最高的数组值和索引

Edm*_*jas 74 c# arrays indexing

所以我有一个未排序的数值数组int[] anArray = { 1, 5, 2, 7 };,我需要得到数组中最大值的值和索引,这将是7和3,我该怎么做?

sa_*_*213 116

这不是最迷人的方式,但有效.

(必须using System.Linq;)

 int maxValue = anArray.Max();
 int maxIndex = anArray.ToList().IndexOf(maxValue);
Run Code Online (Sandbox Code Playgroud)

  • 您节省了大量的编码时间,但最终您将完成两次收集. (9认同)
  • 你甚至不需要`.ToList()`,数组显式实现`IList` (9认同)
  • @millimoose,Array 没有 `IndexOf` 它是一个 `List<T>` 方法,但您可以用 `Array.IndexOf(array,value)` 替换 (2认同)

asr*_*asr 40

int[] anArray = { 1, 5, 2, 7 };
// Finding max
int m = anArray.Max();

// Positioning max
int p = Array.IndexOf(anArray, m);
Run Code Online (Sandbox Code Playgroud)


Tom*_*ing 25

如果索引未排序,则必须至少迭代一次数组才能找到最高值.我用一个简单的for循环:

int? maxVal = null; //nullable so this works even if you have all super-low negatives
int index = -1;
for (int i = 0; i < anArray.Length; i++)
{
  int thisNum = anArray[i];
  if (!maxVal.HasValue || thisNum > maxVal.Value)
  {
    maxVal = thisNum;
    index = i;
  }
}
Run Code Online (Sandbox Code Playgroud)

这比使用LINQ或其他单行解决方案更加冗长,但它可能会更快一些.实际上没有办法比O(N)更快.

  • 你可以通过在索引0处初始化`maxVal`到阵列值保存一次迭代(假设该阵列是至少长1),`index`为0,并且在`I = 1`开始for循环. (3认同)

mil*_*ose 12

强制性LINQ one [1] -liner:

var max = anArray.Select((value, index) => new {value, index})
                 .OrderByDescending(vi => vi.value)
                 .First();
Run Code Online (Sandbox Code Playgroud)

(排序可能比其他解决方案更受欢迎.)

[1]:对于给定的"一"值.

  • 只需添加此解决方案就是O(nlogn)复杂性.对于未排序的数组,可以在O(n)时间内获得最大值. (13认同)

Les*_*ont 6

简洁的单线:

var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();
Run Code Online (Sandbox Code Playgroud)

测试用例:

var anArray = new int[] { 1, 5, 2, 7 };
var max = anArray.Select((n, i) => (Number: n, Index: i)).Max();
Console.WriteLine($"Maximum number = {max.Number}, on index {max.Index}.");
// Maximum number = 7, on index 4.
Run Code Online (Sandbox Code Playgroud)

特征:

  • 使用Linq(没有像vanilla那样优化,但是折衷是更少的代码)。
  • 不需要排序。
  • 计算复杂度:O(n)。
  • 空间复杂度:O(n)。

  • 这真的很整洁! (3认同)
  • 应该指出的是,要使其发挥作用,被最大化的项目 *必须* 是第一个 (2认同)