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.