En c # existe-t-il une méthode pour trouver le maximum de 3 nombres?


99

Comme Math.Max ​​mais prend 3 ou params de int?

Merci


3
Où sont ces chiffres? Comment sont-ils stockés?
Kobi

Réponses:


141

Eh bien, vous pouvez l'appeler deux fois:

int max3 = Math.Max(x, Math.Max(y, z));

Si vous vous retrouvez à faire beaucoup cela, vous pouvez toujours écrire votre propre méthode d'aide ... Je serais assez heureux de voir cela dans ma base de code une fois , mais pas régulièrement.

(Notez que cela sera probablement plus efficace que la réponse basée sur LINQ d'Andrew - mais évidemment, plus vous avez d'éléments, plus l'approche LINQ est attrayante.)

EDIT: Une approche "le meilleur des deux mondes" pourrait être d'avoir un ensemble personnalisé de méthodes dans les deux cas:

public static class MoreMath
{
    // This method only exists for consistency, so you can *always* call
    // MoreMath.Max instead of alternating between MoreMath.Max and Math.Max
    // depending on your argument count.
    public static int Max(int x, int y)
    {
        return Math.Max(x, y);
    }

    public static int Max(int x, int y, int z)
    {
        // Or inline it as x < y ? (y < z ? z : y) : (x < z ? z : x);
        // Time it before micro-optimizing though!
        return Math.Max(x, Math.Max(y, z));
    }

    public static int Max(int w, int x, int y, int z)
    {
        return Math.Max(w, Math.Max(x, Math.Max(y, z)));
    }

    public static int Max(params int[] values)
    {
        return Enumerable.Max(values);
    }
}

De cette façon, vous pouvez écrire MoreMath.Max(1, 2, 3)ou MoreMath.Max(1, 2, 3, 4)sans la surcharge de la création de tableau, mais toujours écrire MoreMath.Max(1, 2, 3, 4, 5, 6)pour un code lisible et cohérent lorsque cela ne vous dérange pas.

Personnellement, je trouve cela plus lisible que la création de tableau explicite de l'approche LINQ.


2
Si vous posez une question comme celle-ci, les performances d'une fonction max ne sont probablement pas pertinentes et la lisibilité prévaudra.
Bas

2
@Andrew: Je pense que c'est correct de lire au même endroit. Si je l'avais plus d'une fois (mais toujours avec 3 paramètres à chaque fois), je préférerais probablement écrire une méthode personnalisée plutôt que d'utiliser l'approche LINQ. MoreMath.Max(x, y, z)est encore plus lisible que l'approche LINQ, IMO.
Jon Skeet

Pourquoi tu n'as pas utilisé juste public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Parce que l'appeler comme Max(1, 2, 3)créera un tableau sans raison. En fournissant quelques surcharges pour un nombre relativement petit de paramètres, vous pouvez le rendre plus efficace sans affecter la lisibilité de l'appelant.
Jon Skeet

Math.Max ​​semble toujours mieux fonctionner jusqu'à ce que vous optimisiez votre code, son avance diminue à mesure que nous passons de 2 -> 3 -> 4, même l'ajout de MoreMath.Max ​​(x, y) entraîne une surcharge mesurable. Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, Inline ~ (1,2) 58ms, (2,1) ~ 53ms, Délégué ~ (1,2) 69ms, (2,1) ~ 61 ms. -> Math sur 3 valeurs: ~ 55ms, Inlined: ~ 62ms. -> 4 valeurs: ~ 75ms vs ~ 80ms ... Le tout fait par 10 millions d'itérations et 5 mesures ... Si vous activez les optimisations, la tendance tourne et Math gagne plus, plus vous ajoutez de valeurs. Mais ... vous auriez besoin de milliards de comparaisons avant que les performances ne comptent.
Jens

152

Vous pouvez utiliser Enumerable.Max:

new [] { 1, 2, 3 }.Max();

2
Je ne savais pas que vous pouviez créer un Enumerable avec []. Nifty.
Mateen Ulhaq

7
@MateenUlhaq c'est raccourci pour new int[] { 1,2,3 }. Il s'agit donc d'un tableau de type int, qui est implicitement déterminé par son contenu.
Mixxiphoid

30

Linq a une fonction Max .

Si vous en avez un, IEnumerable<int>vous pouvez l'appeler directement, mais si vous en avez besoin dans des paramètres séparés, vous pouvez créer une fonction comme celle-ci:

using System.Linq;

...

static int Max(params int[] numbers)
{
    return numbers.Max();
}

Ensuite, vous pouvez l'appeler comme ceci:, max(1, 6, 2)cela permet un nombre arbitraire de paramètres.


2
Oui, selon ma réponse modifiée aussi ... sauf que je voudrais certainement l'appeler Maxplutôt que max, et la rendre statique :) En la surchargeant pour moins de paramètres, vous pouvez la rendre plus efficace aussi.
Jon Skeet

1
@Jon Skeet: devrions-nous vraiment écrire des fonctions pour un liners comme ça?
naveen

5
@naveen: Absolument, si cela rend le code plus clair et que vous l'utilisez à plusieurs endroits. Pourquoi pas?
Jon Skeet

@Jon Skeet: merci pour cette clarification. c'était un doute de conception que j'avais depuis longtemps. to or not to :)
naveen

12

Comme générique

public static T Min<T>(params T[] values) {
    return values.Min();
}

public static T Max<T>(params T[] values) {
    return values.Max();
}

8

hors sujet mais voici la formule pour la valeur moyenne .. juste au cas où quelqu'un le chercherait

Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));

3

Supposons que vous ayez un List<int> intList = new List<int>{1,2,3}si vous voulez obtenir une valeur maximale que vous pourriez faire

int maxValue = intList.Max();

1

Si, pour une raison quelconque (par exemple l'API Space Engineers), System.array n'a pas de définition pour Max et que vous n'avez pas accès à Enumerable, une solution pour Max of n valeurs est:

public int Max(int[] values) {
    if(values.Length < 1) {
        return 0;
    }
    if(values.Length < 2) {
        return values[0];
    }
    if(values.Length < 3) {
       return Math.Max(values[0], values[1]); 
    }
    int runningMax = values[0];
    for(int i=1; i<values.Length - 1; i++) {
       runningMax = Math.Max(runningMax, values[i]);
    }
    return runningMax;
}

0

Vous pouvez essayer ce code:

private float GetBrightestColor(float r, float g, float b) { 
    if (r > g && r > b) {
        return r;
    } else if (g > r && g > b) { 
        return g;
    } else if (b > r && b > g) { 
        return b;
    }
}

Cela ne retournera rien si les nombres sont identiques.
Zuabros

0

La valeur maximale de l'élément dans priceValues ​​[] est maxPriceValues:

double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();

0

Cette fonction prend un tableau d'entiers. (Je comprends parfaitement la plainte de @Jon Skeet concernant l'envoi de tableaux.)

C'est probablement un peu exagéré.

    public static int GetMax(int[] array) // must be a array of ints
    {
        int current_greatest_value = array[0]; // initializes it

        for (int i = 1; i <= array.Length; i++)
        {
            // compare current number against next number

            if (i+1 <= array.Length-1) // prevent "index outside bounds of array" error below with array[i+1]
            {
                // array[i+1] exists
                if (array[i] < array[i+1] || array[i] <= current_greatest_value)
                {
                    // current val is less than next, and less than the current greatest val, so go to next iteration
                    continue;
                }
            } else
            {
                // array[i+1] doesn't exist, we are at the last element
                if (array[i] > current_greatest_value)
                {
                    // current iteration val is greater than current_greatest_value
                    current_greatest_value = array[i];
                }
                break; // next for loop i index will be invalid
            }

            // if it gets here, current val is greater than next, so for now assign that value to greatest_value
            current_greatest_value = array[i];
        }

        return current_greatest_value;
    }

Appelez ensuite la fonction:

int highest_val = GetMax (new[] { 1,6,2,72727275,2323});

// highest_val = 72727275
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.