Em c #, existe um método para encontrar o máximo de 3 números?


99

Como Math.Max, mas leva 3 ou parâmetros de int?

obrigado


3
Onde estão esses números? Como eles são armazenados?
Kobi

Respostas:


141

Bem, você pode simplesmente chamá-lo duas vezes:

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

Se você se pega fazendo muito isso, sempre pode escrever seu próprio método auxiliar ... Eu ficaria feliz em ver isso em minha base de código uma vez , mas não regularmente.

(Observe que é provável que isso seja mais eficiente do que a resposta baseada em LINQ de Andrew - mas obviamente, quanto mais elementos você tiver, mais atraente será a abordagem do LINQ.)

EDITAR: Uma abordagem do "melhor dos dois mundos" pode ser ter um conjunto personalizado de métodos de qualquer maneira:

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

Dessa forma, você pode escrever MoreMath.Max(1, 2, 3)ou MoreMath.Max(1, 2, 3, 4)sem a sobrecarga da criação do array, mas ainda escrever MoreMath.Max(1, 2, 3, 4, 5, 6)para um código legível e consistente quando não se importar com a sobrecarga.

Pessoalmente, acho isso mais legível do que a criação de array explícita da abordagem LINQ.


2
Se você fizer uma pergunta como esta, o desempenho de uma função max é provavelmente irrelevante e a legibilidade prevalecerá.
Bas

2
@Andrew: Acho que não há problema em ler em um só lugar. Se eu o tivesse mais de uma vez (mas ainda com 3 parâmetros todas as vezes), provavelmente preferiria escrever um método personalizado do que usar a abordagem LINQ. MoreMath.Max(x, y, z)é ainda mais legível do que a abordagem LINQ, IMO.
Jon Skeet

Por que você não usou apenas public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Porque chamar isso de Max(1, 2, 3)irá criar um array sem motivo. Ao fornecer algumas sobrecargas para números relativamente pequenos de parâmetros, você pode torná-lo mais eficiente sem afetar a legibilidade do chamador.
Jon Skeet

Math.Max ​​parece ter um desempenho consistentemente melhor até que você otimize seu código, seu lead diminui à medida que vamos de 2 -> 3 -> 4, mesmo adicionando MoreMath.Max ​​(x, y) incorre em um overhead mensurável. Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, Inline ~ (1,2) 58ms, (2,1) ~ 53ms, Delegado ~ (1,2) 69ms, (2,1) ~ 61ms. -> Matemática em 3 valores: ~ 55ms, Inline: ~ 62ms. -> 4 valores: ~ 75ms vs ~ 80ms ... Tudo feito por 10 milhões de iterações e 5 medições ... Se você ativar as otimizações, a tendência muda e o Math ganha mais quanto mais valores você adiciona. Mas ... você precisaria de bilhões de comparações antes que o desempenho importasse.
Jens

152

Você pode usar Enumerable.Max:

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

2
Eu não sabia que você poderia criar um Enumerable com []. Nifty.
Mateen Ulhaq

7
@MateenUlhaq é a abreviação de new int[] { 1,2,3 }. Portanto, é um array do tipo int, que é implicitamente determinado por seu conteúdo.
Mixxiphoid

30

Linq tem uma função Max .

Se você tiver um, IEnumerable<int>pode chamá-lo diretamente, mas se precisar deles em parâmetros separados, você pode criar uma função como esta:

using System.Linq;

...

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

Então você poderia chamá-lo assim:, max(1, 6, 2)ele permite um número arbitrário de parâmetros.


2
Sim, de acordo com minha resposta editada também ... exceto que eu definitivamente gostaria de chamá-lo em Maxvez de maxtorná-lo estático :) Ao sobrecarregá-lo para menos parâmetros, você pode torná-lo mais eficiente também.
Jon Skeet

1
@Jon Skeet: deveríamos realmente escrever funções para uma linha como esta?
naveen

5
@naveen: Com certeza, se tornar o código mais claro e se você o estiver usando em vários lugares. Por que não?
Jon Skeet

@Jon Skeet: obrigado pelo esclarecimento. essa foi uma dúvida de design que eu tive por muito tempo. para ou não :)
naveen

12

Tão 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

fora do tópico, mas aqui está a fórmula para o valor médio .. apenas no caso de alguém estar procurando por isso

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

3

Vamos supor que você tenha um List<int> intList = new List<int>{1,2,3}valor máximo que você poderia fazer

int maxValue = intList.Max();

1

Se, por qualquer motivo (por exemplo, API de engenheiros de espaço), System.array não tiver definição para Max nem você tiver acesso a Enumerable, uma solução para Max de n valores é:

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

Você pode tentar 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;
    }
}

Isso não retornará nada se os números forem iguais.
Zuabros

0

O valor máximo do elemento em priceValues ​​[] é maxPriceValues:

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

0

Esta função leva uma matriz de inteiros. (Eu entendo perfeitamente a reclamação de @Jon Skeet sobre o envio de matrizes.)

Provavelmente é um pouco exagero.

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

Em seguida, chame a função:

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

// highest_val = 72727275
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.