Trong c # có phương pháp nào để tìm giá trị lớn nhất của 3 số không?


99

Giống như Math.Max ​​nhưng lấy 3 hoặc tham số của int?

cảm ơn


3
Những con số này ở đâu? Chúng được lưu trữ như thế nào?
Kobi

Câu trả lời:


141

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.


2
Nếu bạn hỏi một câu hỏi như thế này, hiệu suất của một hàm max rất có thể không liên quan và khả năng đọc sẽ chiếm ưu thế.
Bas

2
@Andrew: Tôi nghĩ đọc ở một nơi là được. Nếu tôi đã có nó nhiều lần (nhưng vẫn có 3 tham số mỗi lần), có lẽ tôi muốn viết một phương thức tùy chỉnh hơn là sử dụng 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.
Jon Skeet

Tại sao bạn không sử dụng chỉ public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Bởi vì gọi như vậy 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.
Jon Skeet

Math.Max ​​dường như liên tục hoạt động tốt hơn cho đến khi bạn tối ưu hóa mã của mình, khách hàng tiềm năng sẽ thu hẹp lại khi chúng ta đi từ 2 -> 3 -> 4, thậm chí thêm MoreMath.Max ​​(x, y) tạo ra một chi phí có thể đo lường được. Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, Inline ~ (1,2) 58ms, (2,1) ~ 53ms, Ủy quyền ~ (1,2) 69ms, (2,1) ~ 61 mili giây. -> Toán trên 3 giá trị: ~ 55ms, Inline: ~ 62ms. -> 4 giá trị: ~ 75ms so với ~ 80ms ... Tất cả được thực hiện bởi 10 triệu lần lặp và 5 phép đo ... Nếu bạn bật tính năng tối ưu hóa, xu hướng sẽ thay đổi và Toán học giành được càng nhiều giá trị bạn thêm vào. Nhưng ... bạn sẽ cần hàng tỷ phép so sánh trước khi hiệu suất trở nên quan trọng.
Jens

152

Bạn có thể sử dụng Enumerable.Max:

new [] { 1, 2, 3 }.Max();

2
Tôi không biết bạn có thể tạo Enumerable với []. Xấu.
Mateen Ulhaq

7
@MateenUlhaq là viết tắt của nó 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ó.
Mixxiphoid

30

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 ý.


2
Đúng vậy, theo câu trả lời đã chỉnh sửa của tôi ... ngoại trừ tôi chắc chắn muốn gọi nó Maxhơn là maxvà 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.
Jon Skeet

1
@Jon Skeet: chúng ta có nên thực sự viết các hàm cho một lớp lót như thế này không?
naveen

5
@naveen: Hoàn toàn có thể, nếu nó làm cho mã rõ ràng hơn và bạn đang sử dụng nó ở nhiều nơi. Tại sao không?
Jon Skeet

@Jon Skeet: cảm ơn đã làm rõ. đó là một thiết kế mà tôi đã nghi ngờ từ lâu. đến hay không :)
naveen

12

Như chung

public static T Min<T>(params T[] values) {
    return values.Min();
}

public static T Max<T>(params T[] values) {
    return values.Max();
}

8

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));

3

Giả sử rằng Bạn có List<int> intList = new List<int>{1,2,3}nếu Bạn muốn nhận giá trị tối đa Bạn có thể làm

int maxValue = intList.Max();

1

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;
}

0

Bạn có thể thử mã này:

private float GetBrightestColor(float r, float g, float b) { 
    if (r > g && r > b) {
        return r;
    } else if (g > r && g > b) { 
        return g;
    } else if (b > r && b > g) { 
        return b;
    }
}

Điều này sẽ không trả về bất cứ điều gì nếu các số giống nhau.
Zuabros

0

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();

0

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.