Як Math.Max, але приймає 3 або параметри int?
Дякую
Як 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, IMO.
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 має функцію Max .
Якщо у вас є, 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