Ответ 1
Ну, вы можете просто называть это дважды:
int max3 = Math.Max(x, Math.Max(y, z));
Если вы обнаружите, что делаете это много, вы всегда можете написать свой собственный вспомогательный метод... Я был бы достаточно счастлив, увидев это в моей базе кода один раз, но не регулярно.
(Обратите внимание, что это, скорее всего, будет более эффективным, чем ответ Andrew LINQ, но, очевидно, чем больше элементов, тем более привлекательным является подход LINQ.)
EDIT: подход "лучший из обоих миров" может состоять в том, чтобы иметь собственный набор методов в любом случае:
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.