Giống như Math.Max nhưng lấy 3 hoặc tham số của int?
cảm ơn
Giống như Math.Max nhưng lấy 3 hoặc tham số của int?
cảm ơn
Câu trả lời:
Bạn chỉ có thể gọi nó hai lần:
int max3 = Math.Max(x, Math.Max(y, z));
Nếu bạn thấy mình làm điều này nhiều, bạn luôn có thể viết phương thức trợ giúp của riêng mình ... Tôi sẽ rất vui khi thấy điều này trong cơ sở mã của tôi một lần , nhưng không thường xuyên.
(Lưu ý rằng câu trả lời này có vẻ hiệu quả hơn câu trả lời dựa trên LINQ của Andrew - nhưng rõ ràng bạn càng có nhiều yếu tố thì cách tiếp cận LINQ càng hấp dẫn.)
CHỈNH SỬA: Cách tiếp cận "tốt nhất của cả hai thế giới" có thể là có một bộ phương pháp tùy chỉnh theo một trong hai cách:
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);
}
}
Bằng cách đó, bạn có thể viết MoreMath.Max(1, 2, 3)
hoặc MoreMath.Max(1, 2, 3, 4)
không cần chi phí tạo mảng, nhưng vẫn viết MoreMath.Max(1, 2, 3, 4, 5, 6)
cho mã dễ đọc và nhất quán khi bạn không bận tâm đến chi phí.
Cá nhân tôi thấy rằng dễ đọc hơn việc tạo mảng rõ ràng của phương pháp LINQ.
MoreMath.Max(x, y, z)
thậm chí còn dễ đọc hơn so với cách tiếp cận LINQ, IMO.
public static int Max(params int[] values)
?
Max(1, 2, 3)
sẽ tạo ra một mảng mà không có lý do. Bằng cách cung cấp một số quá tải cho số lượng thông số tương đối nhỏ, bạn có thể làm cho nó hiệu quả hơn mà không ảnh hưởng đến khả năng đọc của người gọi.
Bạn có thể sử dụng Enumerable.Max
:
new [] { 1, 2, 3 }.Max();
[]
. Xấu.
new int[] { 1,2,3 }
. Vì vậy, nó là một mảng kiểu int, được xác định ngầm bởi nội dung của nó.
Linq có một hàm Max .
Nếu bạn có, IEnumerable<int>
bạn có thể gọi hàm này trực tiếp, nhưng nếu bạn yêu cầu chúng trong các tham số riêng biệt, bạn có thể tạo một hàm như sau:
using System.Linq;
...
static int Max(params int[] numbers)
{
return numbers.Max();
}
Sau đó, bạn có thể gọi nó như thế này:, max(1, 6, 2)
nó cho phép một số lượng tham số tùy ý.
Max
hơn là max
và làm cho nó tĩnh :) Bằng cách nạp chồng cho nó ít tham số hơn, bạn cũng có thể làm cho nó hiệu quả hơn.
Như chung
public static T Min<T>(params T[] values) {
return values.Min();
}
public static T Max<T>(params T[] values) {
return values.Max();
}
lạc đề nhưng đây là công thức cho giá trị trung bình .. đề phòng ai đó đang tìm kiếm nó
Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));
Nếu vì bất kỳ lý do gì (ví dụ: Space Engineers API), System.array không có định nghĩa cho Max cũng như bạn không có quyền truy cập vào Enumerable, giải pháp cho Max của n giá trị là:
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;
}
Giá trị phần tử tối đa trong priceValues [] là maxPriceValues:
double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();
Hàm này nhận một mảng các số nguyên. (Tôi hoàn toàn hiểu khiếu nại của @Jon Skeet về việc gửi mảng.)
Nó có lẽ là một chút quá mức cần thiết.
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;
}
Sau đó gọi hàm:
int highest_val = GetMax (new[] { 1,6,2,72727275,2323});
// highest_val = 72727275