W języku C # jest metoda, aby znaleźć maksymalnie 3 liczby?


99

Podobnie jak Math.Max, ale przyjmuje 3 lub parametry int?

dzięki


3
Gdzie są te liczby? Jak są przechowywane?
Kobi

Odpowiedzi:


142

Cóż, możesz po prostu zadzwonić dwa razy:

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

Jeśli znajdziesz się robić to dużo, zawsze można napisać własne metody pomocnika ... Byłbym szczęśliwy widząc to na tyle w mojej bazy kodu raz , ale nie regularnie.

(Zauważ, że prawdopodobnie będzie to bardziej wydajne niż odpowiedź Andrew oparta na LINQ - ale oczywiście im więcej masz elementów, tym bardziej atrakcyjne jest podejście LINQ).

EDYCJA: podejście „najlepsze z obu światów” może polegać na utworzeniu niestandardowego zestawu metod w dowolny sposób:

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

W ten sposób możesz pisać MoreMath.Max(1, 2, 3)lub MoreMath.Max(1, 2, 3, 4)bez narzutów związanych z tworzeniem tablic, ale nadal pisać MoreMath.Max(1, 2, 3, 4, 5, 6)dla przyjemnego, czytelnego i spójnego kodu, gdy nie masz nic przeciwko narzutowi.

Osobiście uważam, że jest to bardziej czytelne niż jawne tworzenie tablicy w podejściu LINQ.


2
Jeśli zadasz takie pytanie, wykonanie funkcji max jest najprawdopodobniej nieistotne i przeważy czytelność.
Bas

2
@Andrew: Myślę, że można czytać w jednym miejscu. Gdybym miał to więcej niż raz (ale nadal z 3 parametrami za każdym razem), prawdopodobnie wolałbym napisać niestandardową metodę niż używać podejścia LINQ. MoreMath.Max(x, y, z)jest jeszcze bardziej czytelny niż podejście LINQ, IMO.
Jon Skeet

Dlaczego nie użyłeś tylko public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Ponieważ wywołanie tego as Max(1, 2, 3)spowoduje utworzenie tablicy bez powodu. Zapewniając kilka przeciążeń dla stosunkowo niewielkiej liczby parametrów, można zwiększyć wydajność bez wpływu na czytelność wywołującego.
Jon Skeet

Wydaje się, że Math.Max ​​konsekwentnie działa lepiej, dopóki nie zoptymalizujesz swojego kodu, jego lead zmniejsza się w miarę przechodzenia od 2 -> 3 -> 4, nawet dodanie MoreMath.Max ​​(x, y) powoduje wymierny narzut. Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, Inlined ~ (1,2) 58ms, (2,1) ~ 53ms, Delegated ~ (1,2) 69ms, (2,1) ~ 61 ms. -> Matematyka na 3 wartościach: ~ 55 ms, wierszowany: ~ 62 ms. -> 4 wartości: ~ 75 ms vs ~ 80 ms ... Wszystko zrobione przez 10 milionów iteracji i 5 pomiarów ... Jeśli włączysz optymalizacje, trend się zmienia, a matematyka wygrywa tym więcej, im więcej dodasz wartości. Ale ... potrzebowałbyś miliardów porównań, zanim wydajność miałaby znaczenie.
Jens,

153

Możesz użyć Enumerable.Max:

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

2
Nie wiedziałem, że możesz stworzyć Enumerable za pomocą []. Ładne.
Mateen Ulhaq

7
@MateenUlhaq to krótka ręka dla new int[] { 1,2,3 }. Jest to więc tablica typu int, która jest niejawnie określana przez jej zawartość.
Mixxiphoid

30

Linq ma funkcję Max .

Jeśli masz, IEnumerable<int>możesz to wywołać bezpośrednio, ale jeśli potrzebujesz ich w osobnych parametrach, możesz utworzyć taką funkcję:

using System.Linq;

...

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

Wtedy możesz to nazwać tak: max(1, 6, 2)pozwala na dowolną liczbę parametrów.


2
Tak, tak jak w mojej zredagowanej odpowiedzi ... z wyjątkiem tego, że zdecydowanie chciałbym to nazwać, Maxa nie maxi uczynić statycznym :) Przeciążając go dla mniejszej liczby parametrów, możesz sprawić, że będzie bardziej wydajny.
Jon Skeet

1
@Jon Skeet: czy naprawdę powinniśmy pisać funkcje dla takich linerów jak ten?
naveen

5
@naveen: Oczywiście, jeśli sprawia, że ​​kod jest bardziej przejrzysty i używasz go w wielu miejscach. Dlaczego nie?
Jon Skeet

@Jon Skeet: dziękuję za wyjaśnienie. to była wątpliwość projektowa, którą miałem od dawna. to czy nie :)
naveen

12

Jak ogólne

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

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

8

poza tematem, ale oto wzór na średnią wartość .. na wypadek, gdyby ktoś tego szukał

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

3

Załóżmy, że masz a, List<int> intList = new List<int>{1,2,3}jeśli chcesz uzyskać maksymalną wartość, jaką możesz zrobić

int maxValue = intList.Max();

1

Jeśli z jakiegokolwiek powodu (np. Space Engineers API), tablica System.array nie ma definicji Max ani nie masz dostępu do Enumerable, rozwiązaniem dla Max n wartości jest:

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

Możesz spróbować tego kodu:

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

To nie zwróci niczego, jeśli liczby są takie same.
Zuabros

0

Maksymalna wartość elementu w priceValues ​​[] to maxPriceValues:

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

0

Ta funkcja przyjmuje tablicę liczb całkowitych. (Całkowicie rozumiem skargę @Jon Skeet dotyczącą wysyłania tablic.)

To chyba trochę przesada.

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

Następnie wywołaj funkcję:

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

// highest_val = 72727275
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.