En c #, ¿hay un método para encontrar el máximo de 3 números?


99

¿Como Math.Max ​​pero toma 3 o params de int?

Gracias


3
¿Dónde están estos números? ¿Cómo se almacenan?
Kobi

Respuestas:


141

Bueno, puedes llamarlo dos veces:

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

Si te encuentras haciendo esto mucho, siempre puedes escribir tu propio método auxiliar ... Me alegraría mucho ver esto en mi base de código una vez , pero no con regularidad.

(Tenga en cuenta que es probable que esto sea más eficiente que la respuesta basada en LINQ de Andrew, pero obviamente, cuantos más elementos tenga, más atractivo será el enfoque LINQ).

EDITAR: Un enfoque de "lo mejor de ambos mundos" podría ser tener un conjunto personalizado de métodos de cualquier manera:

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 esa manera, puede escribir MoreMath.Max(1, 2, 3)o MoreMath.Max(1, 2, 3, 4)sin la sobrecarga de la creación de matrices, pero aún escribir MoreMath.Max(1, 2, 3, 4, 5, 6)para obtener un código legible y coherente cuando no le importa la sobrecarga.

Personalmente, lo encuentro más legible que la creación explícita de matrices del enfoque LINQ.


2
Si hace una pregunta como esta, el rendimiento de una función máxima probablemente sea irrelevante y prevalecerá la legibilidad.
Bas

2
@ Andrew: Creo que está bien leer en un solo lugar. Si lo tuviera más de una vez (pero aún con 3 parámetros cada vez), probablemente preferiría escribir un método personalizado que usar el enfoque LINQ. MoreMath.Max(x, y, z)es incluso más legible que el enfoque LINQ, en mi opinión.
Jon Skeet

¿Por qué no usaste solo public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Porque llamar a eso Max(1, 2, 3)creará una matriz sin ningún motivo. Al proporcionar algunas sobrecargas para un número relativamente pequeño de parámetros, puede hacerlo más eficiente sin afectar la legibilidad de la persona que llama.
Jon Skeet

Math.Max ​​parece funcionar constantemente mejor hasta que optimiza su código, sus clientes potenciales se reducen a medida que avanzamos de 2 -> 3 -> 4, incluso agregando MoreMath.Max ​​(x, y) incurre en una sobrecarga medible. Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, en línea ~ (1,2) 58ms, (2,1) ~ 53ms, delegado ~ (1,2) 69ms, (2,1) ~ 61ms. -> Matemáticas en 3 valores: ~ 55ms, Inline: ~ 62ms. -> 4 valores: ~ 75ms vs ~ 80ms ... Todo hecho por 10 millones de iteraciones y 5 mediciones ... Si activa las optimizaciones, la tendencia cambia y Math gana más cuanto más valores agrega. Pero ... necesitaría miles de millones de comparaciones antes de que el rendimiento importara.
Jens

152

Podrías usar Enumerable.Max:

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

2
No sabía que se podía crear un Enumerable con []. Hábil.
Mateen Ulhaq

7
@MateenUlhaq es la abreviatura de new int[] { 1,2,3 }. Por lo tanto, es una matriz de tipo int, que está implícitamente determinada por su contenido.
Mixxiphoid

30

Linq tiene una función Max .

Si tiene un IEnumerable<int>, puede llamarlo directamente, pero si los necesita en parámetros separados, puede crear una función como esta:

using System.Linq;

...

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

Entonces podría llamarlo así: max(1, 6, 2)permite un número arbitrario de parámetros.


2
Sí, según mi respuesta editada también ... excepto que definitivamente quiero llamarlo en Maxlugar de max, y hacerlo estático :) Al sobrecargarlo para menos parámetros, también puede hacerlo más eficiente.
Jon Skeet

1
@Jon Skeet: ¿deberíamos realmente escribir funciones para frases como esta?
naveen

5
@naveen: Absolutamente, si aclara el código y lo está usando en varios lugares. Por qué no?
Jon Skeet

@Jon Skeet: gracias por aclarar. Esa fue una duda de diseño que tuve durante mucho tiempo. a o no :)
naveen

12

Como genérico

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

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

8

fuera de tema, pero aquí está la fórmula para el valor medio ... en caso de que alguien lo esté buscando

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

3

Supongamos que tienes un List<int> intList = new List<int>{1,2,3}si quieres obtener un valor máximo que podrías hacer

int maxValue = intList.Max();

1

Si, por cualquier motivo (por ejemplo, la API de Space Engineers), System.array no tiene una definición para Max ni tiene acceso a Enumerable, una solución para Max de n valores es:

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

Puedes probar este código:

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

Esto no devolverá nada si los números son los mismos.
Zuabros

0

El valor máximo del elemento en priceValues ​​[] es maxPriceValues:

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

0

Esta función toma una matriz de números enteros. (Entiendo completamente la queja de @Jon Skeet sobre el envío de matrices).

Probablemente sea un poco exagerado.

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

Luego llama a la función:

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

// highest_val = 72727275
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.