138 votes

C# trouver la valeur la plus élevée d'un tableau et son index

J'ai donc un tableau numérique non trié int[] anArray = { 1, 5, 2, 7 }; et j'ai besoin d'obtenir à la fois la valeur et l'index de la plus grande valeur dans le tableau qui serait 7 et 3, comment dois-je faire ?

198voto

sa_ddam213 Points 18735

Cette méthode n'est pas la plus glamour mais elle fonctionne.

(doit avoir using System.Linq; )

 int maxValue = anArray.Max();
 int maxIndex = anArray.ToList().IndexOf(maxValue);

53voto

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

// Positioning max
int p = Array.IndexOf(anArray, m);

45voto

Lesair Valmont Points 470

Une phrase succincte :

var (number, index) = anArray.Select((n, i) => (n, i)).Max();

Cas de test :

var anArray = new int[] { 1, 5, 7, 4, 2 };
var (number, index) = anArray.Select((n, i) => (n, i)).Max();
Console.WriteLine($"Maximum number = {number}, on index {index}.");
// Maximum number = 7, on index 2.

Caractéristiques :

  • Utilise Linq (pas aussi optimisé que vanilla, mais la contrepartie est moins de code).
  • N'a pas besoin d'être trié.
  • La complexité informatique : O(n).
  • Complexité de l'espace : O(n).

Remarques :

  • Assurez-vous que le numéro (et non l'index) est le premier élément du tuple, car le tri des tuple est effectué en comparant les éléments du tuple de gauche à droite.

36voto

Mr. Jefferson Points 2742

Si l'index n'est pas trié, vous devez itérer dans le tableau au moins une fois pour trouver la valeur la plus élevée. J'utiliserais un simple for boucle :

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;
  }
}

Cette méthode est plus verbeuse que celle utilisant LINQ ou d'autres solutions à une ligne, mais elle est probablement un peu plus rapide. Il n'y a vraiment aucun moyen de rendre cette méthode plus rapide que O(N).

16voto

millimoose Points 22665

L'obligatoire LINQ [1] -liner :

var max = anArray.Select((value, index) => new {value, index})
                 .OrderByDescending(vi => vi.value)
                 .First();

(Le tri est probablement une perte de performance par rapport aux autres solutions).

[1] : Pour des valeurs données de "un".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X