Di c # apakah ada metode untuk menemukan maksimal 3 angka?


99

Seperti Math.Max ​​tetapi membutuhkan 3 atau params dari int?

Terima kasih


3
Dimana angka-angka ini? Bagaimana cara menyimpannya?
Kobi

Jawaban:


142

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.


2
Jika Anda mengajukan pertanyaan seperti ini, kinerja fungsi maksimal kemungkinan besar tidak relevan, dan keterbacaan akan menang.
Bas

2
@ Andrew: Saya pikir tidak apa-apa membaca di satu tempat. Jika saya memilikinya lebih dari sekali (tetapi masih dengan 3 parameter setiap waktu), saya mungkin lebih suka menulis metode kustom daripada menggunakan pendekatan LINQ. MoreMath.Max(x, y, z)bahkan lebih mudah dibaca daripada pendekatan LINQ, IMO.
Jon Skeet

Mengapa Anda tidak terbiasa public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Karena memanggil itu sebagai 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.
Jon Skeet

Math.Max ​​tampaknya secara konsisten berkinerja lebih baik sampai Anda mengoptimalkan kode Anda, leadnya menyusut saat kita pergi dari 2 -> 3 -> 4, bahkan menambahkan MoreMath.Max ​​(x, y) menghasilkan overhead yang dapat diukur. Matematika Maks ~ (1,2) 43ms, (2,1) ~ 38ms, Inline ~ (1,2) 58ms, (2,1) ~ 53ms, Didelegasikan ~ (1,2) 69ms, (2,1) ~ 61 md. -> Matematika pada 3 nilai: ~ 55ms, Inline: ~ 62ms. -> 4 nilai: ~ 75ms vs ~ 80ms ... Semua dilakukan dengan 10 juta iterasi dan 5 pengukuran ... Jika Anda mengaktifkan pengoptimalan, tren berubah dan Matematika menang lebih banyak, semakin banyak nilai yang Anda tambahkan. Tapi ... Anda akan membutuhkan miliaran perbandingan sebelum kinerja itu penting.
Jens

154

Anda bisa menggunakan Enumerable.Max:

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

2
Saya tidak tahu Anda bisa membuat Enumerable with []. Bagus.
Mateen Ulhaq

7
@MateenUlhaq itu adalah kependekan dari new int[] { 1,2,3 }. Jadi ini adalah array tipe int, yang secara implisit ditentukan oleh isinya.
Mixxiphoid

30

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.


2
Yup, sesuai jawaban yang saya edit juga ... kecuali saya pasti ingin memanggilnya Maxdaripada max, dan menjadikannya statis :) Dengan membebani lebih banyak untuk parameter yang lebih sedikit, Anda juga dapat membuatnya lebih efisien.
Jon Skeet

1
@ Jon Skeet: haruskah kita benar-benar menulis fungsi untuk satu liner seperti ini?
naveen

5
@naveen: Tentu saja, jika itu membuat kode lebih jelas, dan Anda menggunakannya di banyak tempat. Kenapa tidak?
Jon Skeet

@ Jon Skeet: terima kasih telah mengklarifikasi. Itu adalah keraguan desain yang saya miliki sejak lama. untuk atau tidak untuk :)
naveen

12

Sebagai generik

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

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

8

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

3

Mari kita asumsikan bahwa Anda memiliki List<int> intList = new List<int>{1,2,3}jika Anda ingin mendapatkan nilai maksimal yang dapat Anda lakukan

int maxValue = intList.Max();

1

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

0

Anda dapat mencoba kode ini:

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

Ini tidak akan mengembalikan apa pun jika angkanya sama.
Zuabros

0

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

0

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.