Wie Math.Max, aber nimmt 3 oder Parameter von int?
Vielen Dank
Wie Math.Max, aber nimmt 3 oder Parameter von int?
Vielen Dank
Antworten:
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.
MoreMath.Max(x, y, z)ist noch besser lesbar als der LINQ-Ansatz IMO.
public static int Max(params int[] values) ?
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.
Sie könnten verwenden Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Raffiniert.
new int[] { 1,2,3 }. Es handelt sich also um ein Array vom Typ int, das implizit durch seinen Inhalt bestimmt wird.
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.
Maxals maxund statisch machen :) Indem Sie es für weniger Parameter überladen, können Sie es auch effizienter machen.
Als generisch
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
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));
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;
}
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();
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