Как Math.Max, но принимает 3 или параметры int?
Спасибо
Ответы:
Ну, вы можете просто позвонить дважды:
int max3 = Math.Max(x, Math.Max(y, z));
Если вы обнаружите, что делаете это часто, вы всегда можете написать свой собственный вспомогательный метод ... Я был бы достаточно счастлив увидеть это в своей базе кода один раз , но не регулярно.
(Обратите внимание, что это, вероятно, будет более эффективным, чем ответ Эндрю на основе LINQ, но, очевидно, чем больше у вас элементов, тем привлекательнее подход LINQ.)
РЕДАКТИРОВАТЬ: подход "лучшее из обоих миров" может заключаться в том, чтобы иметь собственный набор методов в любом случае:
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);
}
}
Таким образом, вы можете писать MoreMath.Max(1, 2, 3)или MoreMath.Max(1, 2, 3, 4)без накладных расходов на создание массива, но по-прежнему писать MoreMath.Max(1, 2, 3, 4, 5, 6)для приятного читаемого и последовательного кода, когда вы не возражаете против накладных расходов.
Я лично считаю это более читаемым, чем явное создание массива в рамках подхода LINQ.
MoreMath.Max(x, y, z)даже более читабелен, чем подход LINQ, ИМО.
public static int Max(params int[] values) ?
Max(1, 2, 3) создаст массив без причины. Предоставляя несколько перегрузок для относительно небольшого количества параметров, вы можете сделать его более эффективным, не влияя на удобочитаемость вызывающего.
Вы можете использовать Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Отлично.
new int[] { 1,2,3 }. Итак, это массив типа int, который неявно определяется его содержимым.
У Linq есть Макс .
Если у вас есть, IEnumerable<int>вы можете вызвать это напрямую, но если вам нужны отдельные параметры, вы можете создать такую функцию:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
Тогда вы могли бы назвать его так:, max(1, 6, 2)он допускает произвольное количество параметров.
Maxа не maxи сделать его статическим :) Перегрузив его для меньшего количества параметров, вы также можете сделать его более эффективным.
Как общий
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
не по теме, но вот формула среднего значения .. на всякий случай, если кто-то его ищет
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Если по какой-либо причине (например, Space Engineers API) System.array не имеет определения Max и у вас нет доступа к Enumerable, решение для Max из n значений:
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;
}
Максимальное значение элемента в priceValues [] - maxPriceValues:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Эта функция принимает массив целых чисел. (Я полностью понимаю жалобу @Jon Skeet на отправку массивов.)
Наверное, это перебор.
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;
}
Затем вызовите функцию:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275