У c # існує спосіб знайти максимум 3 числа?


Відповіді:


141

Ну, ви можете просто зателефонувати двічі:

int max3 = Math.Max(x, Math.Max(y, z));

Якщо ви виявляєте, що робите це багато, ви завжди можете написати власний допоміжний метод ... Я був би щасливий, побачивши це один раз у своїй базі коду , але не регулярно.

(Зверніть увагу, що це, швидше за все, буде ефективнішим, ніж відповідь Ендрю на основі LINQ - але, очевидно, чим більше елементів у вас є, тим привабливішим є підхід LINQ.)

РЕДАГУВАТИ: Підхід "найкращого з обох світів" може полягати в наявності власного набору методів у будь-який спосіб:

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

Таким чином, ви можете писати MoreMath.Max(1, 2, 3)або MoreMath.Max(1, 2, 3, 4)без накладних витрат на створення масиву, але все одно пишете MoreMath.Max(1, 2, 3, 4, 5, 6)для приємного для читання та послідовного коду, коли ви не проти накладних витрат.

Я особисто вважаю, що це читабельніше, ніж явне створення масиву підходу LINQ.


2
Якщо задати таке запитання, то функція max, швидше за все, не має значення, і читабельність переважатиме.
Бас

2
@Andrew: Я думаю, що нормально читати в одному місці. Якби я мав це більше одного разу (але все одно з 3 параметрами кожного разу), я, напевно, скоріше писав би власний метод, ніж використовував підхід LINQ. MoreMath.Max(x, y, z)є навіть більш читабельним, ніж підхід LINQ, IMO.
Джон Скіт,

Чому ви не використовували просто public static int Max(params int[] values) ?
Navid Rahmani

2
@Navid: Тому що виклик цього як Max(1, 2, 3)створить масив без причини. Забезпечивши кілька перевантажень для відносно невеликої кількості параметрів, ви можете зробити його більш ефективним, не впливаючи на читабельність абонента.
Джон Скіт,

Здається, Math.Max ​​стабільно працює краще, доки ви не оптимізуєте свій код; його свинець скорочується, коли ми переходимо від 2 -> 3 -> 4, навіть додавання MoreMath.Max ​​(x, y) викликає помітні накладні витрати. Math.Max ​​~ (1,2) 43 мс, (2,1) ~ 38 мс, вбудований ~ (1,2) 58 мс, (2,1) ~ 53 мс, делегований ~ (1,2) 69 мс, (2,1) ~ 61 мс. -> Математика на 3 значення: ~ 55 мс, вбудований: ~ 62 мс. -> 4 значення: ~ 75 мс проти ~ 80 мс ... Все зроблено за 10 мільйонів ітерацій та 5 вимірювань ... Якщо ви ввімкнете оптимізацію, тренд обернеться і математика виграє тим більше, чим більше значень ви додасте. Але ... вам знадобляться мільярди порівнянь до того, як продуктивність має значення.
Йенс

152

Ви можете використовувати Enumerable.Max:

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

2
Я не знав, що ти можеш створити Enumerable за допомогою []. Чудова
Mateen Ulhaq

7
@MateenUlhaq це коротка рука new int[] { 1,2,3 }. Отже, це масив типу int, який неявно визначається його змістом.
Mixxiphoid

30

Linq має функцію Max .

Якщо у вас є, IEnumerable<int>ви можете зателефонувати безпосередньо, але якщо вам потрібні окремі параметри, ви можете створити таку функцію:

using System.Linq;

...

static int Max(params int[] numbers)
{
    return numbers.Max();
}

Тоді ви можете назвати це так:, max(1, 6, 2)воно дозволяє довільну кількість параметрів.


2
Так, згідно з моєю відредагованою відповіддю теж ... за винятком того, що я точно хотів би назвати це, Maxа не max, і зробити його статичним :) Перевантаживши його на меншу кількість параметрів, ви також можете зробити його більш ефективним.
Джон Скіт,

1
@Jon Skeet: чи ми повинні справді писати функції для таких лайнерів, як цей?
naveen

5
@naveen: Безумовно, якщо це робить код чіткішим, і ви використовуєте його в кількох місцях. Чому ні?
Джон Скіт,

@ Джон Скіт: дякую за роз'яснення. це був сумнів у дизайні, який я мав довго. до чи ні :)
навєн


8

поза темою, але ось формула середнього значення .. про всяк випадок, якщо хтось її шукає

Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));

3

Припустимо, що у вас є, List<int> intList = new List<int>{1,2,3}якщо ви хочете отримати максимальне значення, яке ви могли б зробити

int maxValue = intList.Max();

1

Якщо з якихось причин (наприклад, Space Engineers API) System.array не має визначення Max, а також у вас немає доступу до Enumerable, рішення для Max з n значень:

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

Ви можете спробувати цей код:

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

Це не поверне нічого, якщо цифри однакові.
Zuabros

0

Максимальне значення елемента в priceValues ​​[] - maxPriceValues:

double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();

0

Ця функція приймає масив цілих чисел. (Я повністю розумію скаргу @Jon Skeet на надсилання масивів.)

Це, мабуть, трохи надмірно.

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

Потім викличте функцію:

int highest_val = GetMax (new[] { 1,6,2,72727275,2323});

// highest_val = 72727275
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.