Como Math.Max, mas leva 3 ou parâmetros de int?
obrigado
Como Math.Max, mas leva 3 ou parâmetros de int?
obrigado
Respostas:
Bem, você pode simplesmente chamá-lo duas vezes:
int max3 = Math.Max(x, Math.Max(y, z));
Se você se pega fazendo muito isso, sempre pode escrever seu próprio método auxiliar ... Eu ficaria feliz em ver isso em minha base de código uma vez , mas não regularmente.
(Observe que é provável que isso seja mais eficiente do que a resposta baseada em LINQ de Andrew - mas obviamente, quanto mais elementos você tiver, mais atraente será a abordagem do LINQ.)
EDITAR: Uma abordagem do "melhor dos dois mundos" pode ser ter um conjunto personalizado de métodos de qualquer maneira:
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);
}
}
Dessa forma, você pode escrever MoreMath.Max(1, 2, 3)ou MoreMath.Max(1, 2, 3, 4)sem a sobrecarga da criação do array, mas ainda escrever MoreMath.Max(1, 2, 3, 4, 5, 6)para um código legível e consistente quando não se importar com a sobrecarga.
Pessoalmente, acho isso mais legível do que a criação de array explícita da abordagem LINQ.
MoreMath.Max(x, y, z)é ainda mais legível do que a abordagem LINQ, IMO.
public static int Max(params int[] values) ?
Max(1, 2, 3)irá criar um array sem motivo. Ao fornecer algumas sobrecargas para números relativamente pequenos de parâmetros, você pode torná-lo mais eficiente sem afetar a legibilidade do chamador.
Você pode usar Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Nifty.
new int[] { 1,2,3 }. Portanto, é um array do tipo int, que é implicitamente determinado por seu conteúdo.
Linq tem uma função Max .
Se você tiver um, IEnumerable<int>pode chamá-lo diretamente, mas se precisar deles em parâmetros separados, você pode criar uma função como esta:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
Então você poderia chamá-lo assim:, max(1, 6, 2)ele permite um número arbitrário de parâmetros.
Maxvez de maxtorná-lo estático :) Ao sobrecarregá-lo para menos parâmetros, você pode torná-lo mais eficiente também.
Tão genérico
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
fora do tópico, mas aqui está a fórmula para o valor médio .. apenas no caso de alguém estar procurando por isso
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Se, por qualquer motivo (por exemplo, API de engenheiros de espaço), System.array não tiver definição para Max nem você tiver acesso a Enumerable, uma solução para Max de n valores é:
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;
}
O valor máximo do elemento em priceValues [] é maxPriceValues:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Esta função leva uma matriz de inteiros. (Eu entendo perfeitamente a reclamação de @Jon Skeet sobre o envio de matrizes.)
Provavelmente é um pouco exagero.
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;
}
Em seguida, chame a função:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275