Gibt es in c # eine Methode, um das Maximum von 3 Zahlen zu finden?


99

Wie Math.Max, aber nimmt 3 oder Parameter von int?

Vielen Dank


3
Wo sind diese Zahlen? Wie werden sie gespeichert?
Kobi

Antworten:


141

Nun, Sie können es einfach zweimal nennen:

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

Wenn Sie sich , dies zu tun eine Menge finden, können Sie immer Ihre eigene Hilfsmethode schreiben ... Ich würde glücklich genug sein , dies in meiner Code - Basis zu sehen , einmal , aber nicht regelmäßig.

(Beachten Sie, dass dies wahrscheinlich effizienter ist als Andrews LINQ-basierte Antwort - aber je mehr Elemente Sie haben, desto attraktiver ist der LINQ-Ansatz.)

BEARBEITEN: Ein "Best of Both Worlds" -Ansatz könnte darin bestehen, eine benutzerdefinierte Reihe von Methoden zu verwenden:

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

Auf diese Weise können Sie schreiben MoreMath.Max(1, 2, 3)oder MoreMath.Max(1, 2, 3, 4)ohne den Aufwand für die Array-Erstellung, aber dennoch MoreMath.Max(1, 2, 3, 4, 5, 6)für gut lesbaren und konsistenten Code schreiben, wenn Ihnen der Aufwand nichts ausmacht.

Ich persönlich finde das lesbarer als die explizite Array-Erstellung des LINQ-Ansatzes.


2
Wenn Sie eine solche Frage stellen, ist die Leistung einer Max-Funktion höchstwahrscheinlich irrelevant, und die Lesbarkeit würde sich durchsetzen.
Bas

2
@ Andrew: Ich denke, es ist okay, an einem Ort zu lesen . Wenn ich es mehr als einmal hätte (aber jedes Mal immer noch mit 3 Parametern), würde ich wahrscheinlich lieber eine benutzerdefinierte Methode schreiben, als den LINQ-Ansatz zu verwenden. MoreMath.Max(x, y, z)ist noch besser lesbar als der LINQ-Ansatz IMO.
Jon Skeet

Warum hast du nicht einfach benutzt public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Weil das Aufrufen von as Max(1, 2, 3)ein Array ohne Grund erstellt. Durch die Bereitstellung einiger Überladungen für eine relativ kleine Anzahl von Parametern können Sie die Effizienz steigern, ohne die Lesbarkeit des Anrufers zu beeinträchtigen.
Jon Skeet

Math.Max ​​scheint durchweg eine bessere Leistung zu erzielen, bis Sie Ihren Code optimieren. Der Lead schrumpft, wenn wir von 2 -> 3 -> 4 wechseln. Selbst das Hinzufügen von MoreMath.Max ​​(x, y) verursacht einen messbaren Overhead. Math.Max ​​~ (1,2) 43 ms, (2,1) ~ 38 ms, Inline ~ (1,2) 58 ms, (2,1) ~ 53 ms, delegiert ~ (1,2) 69 ms, (2,1) ~ 61ms. -> Mathe auf 3 Werten: ~ 55ms, Inline: ~ 62ms. -> 4 Werte: ~ 75 ms vs ~ 80 ms ... Alles erledigt durch 10 Millionen Iterationen und 5 Messungen ... Wenn Sie Optimierungen aktivieren, dreht sich der Trend und Math gewinnt mehr, je mehr Werte Sie hinzufügen. Aber ... Sie würden Milliarden von Vergleichen benötigen, bevor die Leistung zählt.
Jens

152

Sie könnten verwenden Enumerable.Max:

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

2
Ich wusste nicht, dass Sie eine Aufzählung mit erstellen können []. Raffiniert.
Mateen Ulhaq

7
@MateenUlhaq es ist eine kurze Hand für new int[] { 1,2,3 }. Es handelt sich also um ein Array vom Typ int, das implizit durch seinen Inhalt bestimmt wird.
Mixxiphoid

30

Linq hat eine Max- Funktion.

Wenn Sie eine haben IEnumerable<int>, können Sie diese direkt aufrufen. Wenn Sie diese jedoch in separaten Parametern benötigen, können Sie eine Funktion wie die folgende erstellen:

using System.Linq;

...

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

Dann könnte man es so nennen : max(1, 6, 2), es erlaubt eine beliebige Anzahl von Parametern.


2
Ja, gemäß meiner bearbeiteten Antwort auch ... außer ich würde es definitiv lieber aufrufen Maxals maxund statisch machen :) Indem Sie es für weniger Parameter überladen, können Sie es auch effizienter machen.
Jon Skeet

1
@ Jon Skeet: Sollten wir wirklich Funktionen für einen solchen Liner schreiben?
Naveen

5
@naveen: Absolut, wenn es den Code klarer macht und Sie ihn an mehreren Stellen verwenden. Warum nicht?
Jon Skeet

@ Jon Skeet: Danke für die Klarstellung. Das war ein Design-Zweifel, den ich lange hatte. zu oder nicht zu :)
Naveen

12

Als generisch

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

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

8

Off Topic, aber hier ist die Formel für den mittleren Wert .. nur für den Fall, dass jemand danach sucht

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

3

Nehmen wir an, Sie haben einen, List<int> intList = new List<int>{1,2,3}wenn Sie einen Maximalwert erhalten möchten, den Sie tun könnten

int maxValue = intList.Max();

1

Wenn System.array aus irgendeinem Grund (z. B. Space Engineers API) keine Definition für Max hat und Sie keinen Zugriff auf Enumerable haben, lautet eine Lösung für Max von n Werten:

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

Sie könnten diesen Code ausprobieren:

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

Dies gibt nichts zurück, wenn die Zahlen gleich sind.
Zuabros

0

Der maximale Elementwert in priceValues ​​[] ist maxPriceValues:

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

0

Diese Funktion verwendet ein Array von Ganzzahlen. (Ich verstehe die Beschwerde von @Jon Skeet über das Senden von Arrays vollkommen.)

Es ist wahrscheinlich ein bisschen übertrieben.

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

Rufen Sie dann die Funktion auf:

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

// highest_val = 72727275
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.