Comme Math.Max mais prend 3 ou params de int?
Merci
Comme Math.Max mais prend 3 ou params de int?
Merci
Réponses:
Eh bien, vous pouvez l'appeler deux fois:
int max3 = Math.Max(x, Math.Max(y, z));
Si vous vous retrouvez à faire beaucoup cela, vous pouvez toujours écrire votre propre méthode d'aide ... Je serais assez heureux de voir cela dans ma base de code une fois , mais pas régulièrement.
(Notez que cela sera probablement plus efficace que la réponse basée sur LINQ d'Andrew - mais évidemment, plus vous avez d'éléments, plus l'approche LINQ est attrayante.)
EDIT: Une approche "le meilleur des deux mondes" pourrait être d'avoir un ensemble personnalisé de méthodes dans les deux cas:
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);
}
}
De cette façon, vous pouvez écrire MoreMath.Max(1, 2, 3)ou MoreMath.Max(1, 2, 3, 4)sans la surcharge de la création de tableau, mais toujours écrire MoreMath.Max(1, 2, 3, 4, 5, 6)pour un code lisible et cohérent lorsque cela ne vous dérange pas.
Personnellement, je trouve cela plus lisible que la création de tableau explicite de l'approche LINQ.
MoreMath.Max(x, y, z)est encore plus lisible que l'approche LINQ, IMO.
public static int Max(params int[] values) ?
Max(1, 2, 3)créera un tableau sans raison. En fournissant quelques surcharges pour un nombre relativement petit de paramètres, vous pouvez le rendre plus efficace sans affecter la lisibilité de l'appelant.
Vous pouvez utiliser Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Nifty.
new int[] { 1,2,3 }. Il s'agit donc d'un tableau de type int, qui est implicitement déterminé par son contenu.
Linq a une fonction Max .
Si vous en avez un, IEnumerable<int>vous pouvez l'appeler directement, mais si vous en avez besoin dans des paramètres séparés, vous pouvez créer une fonction comme celle-ci:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
Ensuite, vous pouvez l'appeler comme ceci:, max(1, 6, 2)cela permet un nombre arbitraire de paramètres.
Maxplutôt que max, et la rendre statique :) En la surchargeant pour moins de paramètres, vous pouvez la rendre plus efficace aussi.
Comme générique
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
hors sujet mais voici la formule pour la valeur moyenne .. juste au cas où quelqu'un le chercherait
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Si, pour une raison quelconque (par exemple l'API Space Engineers), System.array n'a pas de définition pour Max et que vous n'avez pas accès à Enumerable, une solution pour Max of n valeurs est:
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;
}
La valeur maximale de l'élément dans priceValues [] est maxPriceValues:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Cette fonction prend un tableau d'entiers. (Je comprends parfaitement la plainte de @Jon Skeet concernant l'envoi de tableaux.)
C'est probablement un peu exagéré.
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;
}
Appelez ensuite la fonction:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275