In c # esiste un metodo per trovare il massimo di 3 numeri?


99

Come Math.Max ​​ma richiede 3 o parametri di int?

Grazie


3
Dove sono questi numeri? Come vengono conservati?
Kobi

Risposte:


141

Bene, puoi chiamarlo due volte:

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

Se ti accorgi di farlo spesso, potresti sempre scrivere il tuo metodo di supporto ... Sarei abbastanza felice di vederlo nel mio codice una volta , ma non regolarmente.

(Si noti che è probabile che questo sia più efficiente della risposta basata su LINQ di Andrew, ma ovviamente più elementi si hanno più è interessante l'approccio LINQ.)

EDIT: un approccio "il meglio di entrambi i mondi" potrebbe essere quello di avere un set personalizzato di metodi in entrambi i casi:

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

In questo modo puoi scrivere MoreMath.Max(1, 2, 3)o MoreMath.Max(1, 2, 3, 4)senza l'overhead della creazione dell'array, ma MoreMath.Max(1, 2, 3, 4, 5, 6)puoi comunque scrivere per un codice leggibile e coerente quando non ti dispiace l'overhead.

Personalmente lo trovo più leggibile rispetto alla creazione esplicita di array dell'approccio LINQ.


2
Se si pone una domanda come questa, le prestazioni di una funzione max sono molto probabilmente irrilevanti e la leggibilità prevarrebbe.
Bas

2
@ Andrew: Penso che vada bene leggere in un unico posto. Se lo avessi più di una volta (ma sempre con 3 parametri ogni volta), probabilmente preferirei scrivere un metodo personalizzato piuttosto che utilizzare l'approccio LINQ. MoreMath.Max(x, y, z)è ancora più leggibile dell'approccio LINQ, IMO.
Jon Skeet

Perché non l'hai usato solo public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Perché chiamarlo as Max(1, 2, 3)creerà un array senza motivo. Fornendo alcuni overload per un numero relativamente ridotto di parametri, è possibile renderlo più efficiente senza influire sulla leggibilità del chiamante.
Jon Skeet

Math.Max ​​sembra funzionare costantemente meglio fino a quando non si ottimizza il codice, il suo lead si riduce man mano che si passa da 2 -> 3 -> 4, anche l'aggiunta di MoreMath.Max ​​(x, y) comporta un overhead misurabile. Matematica Max ~ (1,2) 43 ms, (2,1) ~ 38 ms, Inlined ~ (1,2) 58 ms, (2,1) ~ 53 ms, Delegato ~ (1,2) 69 ms, (2,1) ~ 61 ms. -> Matematica su 3 valori: ~ 55 ms, Inline: ~ 62 ms. -> 4 valori: ~ 75 ms contro ~ 80 ms ... Tutto fatto da 10 milioni di iterazioni e 5 misurazioni ... Se attivi le ottimizzazioni, il trend cambia e la matematica vince di più più valori aggiungi. Ma ... avresti bisogno di miliardi di confronti prima che le prestazioni abbiano importanza.
Jens

152

Potresti usare Enumerable.Max:

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

2
Non sapevo che potessi creare un Enumerable con []. Nifty.
Mateen Ulhaq

7
@MateenUlhaq è una mano corta per new int[] { 1,2,3 }. Quindi è un array di tipo int, che è implicitamente determinato dal suo contenuto.
Mixxiphoid

30

Linq ha una funzione Max .

Se hai un IEnumerable<int>puoi chiamarlo direttamente, ma se li richiedi in parametri separati potresti creare una funzione come questa:

using System.Linq;

...

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

Quindi potresti chiamarlo in questo max(1, 6, 2)modo:, consente un numero arbitrario di parametri.


2
Sì, anche come da mia risposta modificata ... tranne che vorrei sicuramente chiamarlo Maxpiuttosto che max, e renderlo statico :) Sovraccaricandolo per meno parametri, puoi anche renderlo più efficiente.
Jon Skeet

1
@ Jon Skeet: dovremmo davvero scrivere funzioni per una riga come questa?
naveen

5
@naveen: Assolutamente, se rende il codice più chiaro e lo stai usando in più posti. Perchè no?
Jon Skeet

@ Jon Skeet: grazie per aver chiarito. quello era un dubbio sul design che avevo a lungo. to or not to :)
naveen

12

Come generico

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

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

8

fuori tema ma ecco la formula per il valore medio .. nel caso qualcuno lo stia cercando

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

3

Supponiamo che tu abbia un List<int> intList = new List<int>{1,2,3}se vuoi ottenere un valore massimo che potresti fare

int maxValue = intList.Max();

1

Se, per qualsiasi motivo (ad es. API Space Engineers), System.array non ha una definizione per Max né hai accesso a Enumerable, una soluzione per Max di n valori è:

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

Potresti provare questo codice:

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

Questo non restituirà nulla se i numeri sono gli stessi.
Zuabros,

0

Il valore massimo dell'elemento in priceValues ​​[] è maxPriceValues:

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

0

Questa funzione accetta un array di numeri interi. (Comprendo perfettamente il reclamo di @Jon Skeet sull'invio di array.)

Probabilmente è un po 'eccessivo.

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

Quindi chiama la funzione:

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

// highest_val = 72727275
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.