Podobnie jak Math.Max, ale przyjmuje 3 lub parametry int?
dzięki
Podobnie jak Math.Max, ale przyjmuje 3 lub parametry int?
dzięki
Odpowiedzi:
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.
MoreMath.Max(x, y, z)jest jeszcze bardziej czytelny niż podejście LINQ, IMO.
public static int Max(params int[] values) ?
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.
Możesz użyć Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Ładne.
new int[] { 1,2,3 }. Jest to więc tablica typu int, która jest niejawnie określana przez jej zawartość.
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.
Maxa nie maxi uczynić statycznym :) Przeciążając go dla mniejszej liczby parametrów, możesz sprawić, że będzie bardziej wydajny.
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();
}
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));
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;
}
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();
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