Seperti Math.Max tetapi membutuhkan 3 atau params dari int?
Terima kasih
Seperti Math.Max tetapi membutuhkan 3 atau params dari int?
Terima kasih
Jawaban:
Nah, Anda bisa menyebutnya dua kali:
int max3 = Math.Max(x, Math.Max(y, z));
Jika Anda sering melakukan ini, Anda selalu dapat menulis metode pembantu Anda sendiri ... Saya akan cukup senang melihat ini di basis kode saya sekali , tetapi tidak secara teratur.
(Perhatikan bahwa ini mungkin lebih efisien daripada jawaban Andrew berbasis LINQ - tetapi jelas semakin banyak elemen yang Anda miliki, semakin menarik pendekatan LINQ.)
EDIT: Pendekatan "terbaik dari kedua dunia" mungkin memiliki sekumpulan metode khusus dengan cara apa pun:
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);
}
}
Dengan cara itu Anda dapat menulis MoreMath.Max(1, 2, 3)atau MoreMath.Max(1, 2, 3, 4)tanpa overhead pembuatan array, tetapi tetap menulis MoreMath.Max(1, 2, 3, 4, 5, 6)untuk kode yang mudah dibaca dan konsisten ketika Anda tidak keberatan dengan overhead.
Saya pribadi menemukan bahwa lebih mudah dibaca daripada pembuatan array eksplisit dari pendekatan LINQ.
MoreMath.Max(x, y, z)bahkan lebih mudah dibaca daripada pendekatan LINQ, IMO.
public static int Max(params int[] values) ?
Max(1, 2, 3)akan membuat array tanpa alasan. Dengan memberikan beberapa kelebihan beban untuk sejumlah kecil parameter, Anda dapat membuatnya lebih efisien tanpa mempengaruhi keterbacaan pemanggil.
Anda bisa menggunakan Enumerable.Max:
new [] { 1, 2, 3 }.Max();
[]. Bagus.
new int[] { 1,2,3 }. Jadi ini adalah array tipe int, yang secara implisit ditentukan oleh isinya.
Linq memiliki fungsi Max .
Jika Anda memiliki, IEnumerable<int>Anda dapat memanggil ini secara langsung, tetapi jika Anda memerlukan ini dalam parameter terpisah, Anda dapat membuat fungsi seperti ini:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
Kemudian Anda dapat menyebutnya seperti ini:, ini max(1, 6, 2)memungkinkan sejumlah parameter yang berubah-ubah.
Maxdaripada max, dan menjadikannya statis :) Dengan membebani lebih banyak untuk parameter yang lebih sedikit, Anda juga dapat membuatnya lebih efisien.
Sebagai generik
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
off topic tapi berikut adalah rumus untuk nilai tengah .. kalau-kalau ada yang mencarinya
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Jika, karena alasan apa pun (misalnya, Space Engineers API), System.array tidak memiliki definisi untuk Max dan Anda juga tidak memiliki akses ke Enumerable, solusi untuk nilai Max n adalah:
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;
}
Nilai elemen maksimum dalam priceValues [] adalah maxPriceValues:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Fungsi ini mengambil array bilangan bulat. (Saya benar-benar memahami keluhan @Jon Skeet tentang pengiriman array.)
Ini mungkin sedikit berlebihan.
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;
}
Kemudian panggil fungsinya:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275