Math.Max gibi ama 3 veya params alıyor mu?
Teşekkürler
Math.Max gibi ama 3 veya params alıyor mu?
Teşekkürler
Yanıtlar:
Peki, onu iki kez arayabilirsin:
int max3 = Math.Max(x, Math.Max(y, z));
Kendinizi bunu çok sık yaparken bulursanız, her zaman kendi yardımcı yönteminizi yazabilirsiniz ... Bunu kod tabanımda bir kez görmekten yeterince mutlu olurum , ancak düzenli olarak değil.
(Bunun Andrew'un LINQ temelli cevabından daha verimli olacağına dikkat edin - ancak açıkçası ne kadar çok öğeye sahipseniz LINQ yaklaşımı o kadar çekici olur.)
DÜZENLEME: "Her iki dünyanın en iyisi" yaklaşımı, her iki şekilde de özel bir yöntem setine sahip olmak olabilir:
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);
}
}
Bu şekilde yazabilir MoreMath.Max(1, 2, 3)veya MoreMath.Max(1, 2, 3, 4)dizi oluşturma yükü olmadan, ama yine de yazmak MoreMath.Max(1, 2, 3, 4, 5, 6)size yükü sakıncası zaman güzel okunabilir ve tutarlı kodu.
Ben şahsen bunu LINQ yaklaşımının açık dizi yaratımından daha okunaklı buluyorum .
MoreMath.Max(x, y, z)LINQ yaklaşımı olan IMO'dan bile daha okunabilir.
public static int Max(params int[] values) ?
Max(1, 2, 3)bir dizi yaratacaktır. Nispeten az sayıda parametre için birkaç aşırı yükleme sağlayarak, arayanın okunabilirliğini etkilemeden onu daha verimli hale getirebilirsiniz.
Şunları kullanabilirsiniz Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Şık.
new int[] { 1,2,3 }. Dolayısıyla, içeriği tarafından dolaylı olarak belirlenen int türünde bir dizidir.
Linq'in bir Max işlevi vardır.
Eğer bir tane IEnumerable<int>varsa, bunu doğrudan çağırabilirsin, ama eğer bunları ayrı parametrelerde istiyorsan, şöyle bir fonksiyon yaratabilirsin:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
O zaman buna şöyle diyebilirsiniz: max(1, 6, 2)keyfi sayıda parametreye izin verir.
Maxyerine çağırmak maxve onu statik yapmak isterdim :) Daha az parametre için aşırı yükleyerek, daha verimli hale getirebilirsiniz.
Jenerik olarak
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
konu dışı ama işte orta değerin formülü ... birisinin araması ihtimaline karşı
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Herhangi bir nedenle (örneğin Space Engineers API), System.array'in Max için bir tanımı yoksa veya Enumerable'a erişiminiz yoksa, Max of n değerleri için bir çözüm şudur:
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 [] içindeki maksimum öğe değeri maxPriceValues şeklindedir:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Bu işlev bir dizi tamsayı alır. (@Jon Skeet'in dizi gönderme konusundaki şikayetini tamamen anlıyorum.)
Muhtemelen biraz abartılıdı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;
}
Ardından işlevi çağırın:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275