C #에서 최대 3 개의 숫자를 찾는 방법이 있습니까?


99

Math.Max와 비슷하지만 int의 3 개 또는 params를 사용합니까?

감사


3
이 숫자는 어디에 있습니까? 그들은 어떻게 저장됩니까?
Kobi 2011

답변:


142

글쎄, 당신은 그것을 두 번 호출 할 수 있습니다.

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

이 작업을 많이 수행하는 경우 항상 자신 만의 도우미 메서드를 작성할 수 있습니다. 내 코드베이스에서이 작업을 한 번 볼 수 있으면 좋겠지 만 규칙적으로는 아닙니다.

(이것은 Andrew의 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 함수의 성능은 거의 관련이 없으며 가독성이 우선합니다.
Bas

2
@ 앤드류 : 곳 에서 읽는 것도 괜찮은 것 같아요 . 두 번 이상 (그러나 매번 3 개의 매개 변수가 있음) 경우 LINQ 접근 방식을 사용하는 것보다 사용자 지정 메서드를 작성하는 것이 좋습니다. MoreMath.Max(x, y, z)LINQ 접근 방식 인 IMO보다 훨씬 더 읽기 쉽습니다.
Jon Skeet 2011

왜 그냥 사용하지 public static int Max(params int[] values) 않습니까?
Navid Rahmani 2011

2
@Navid : 그대로 호출하면 Max(1, 2, 3)아무런 이유없이 배열이 생성됩니다. 상대적으로 적은 수의 매개 변수에 대해 몇 가지 오버로드를 제공하면 호출자의 가독성에 영향을주지 않고 더 효율적으로 만들 수 있습니다.
Jon Skeet

Math.Max는 코드를 최적화 할 때까지 일관되게 더 나은 성능을 보이는 것 같습니다. 2-> 3-> 4로 이동함에 따라 리드가 줄어들고 MoreMath.Max ​​(x, y)를 추가해도 측정 가능한 오버 헤드가 발생합니다. 수학 최대 ~ (1,2) 43ms, (2,1) ~ 38ms, 인라인 ~ (1,2) 58ms, (2,1) ~ 53ms, 위임 됨 ~ (1,2) 69ms, (2,1) ~ 61ms. -> 3 개 값에 대한 수학 : ~ 55ms, 인라인 : ~ 62ms. -> 4 개 값 : ~ 75ms 대 ~ 80ms ... 모두 1,000 만 번의 반복과 5 회 측정으로 수행됩니다. 최적화를 켜면 추세가 바뀌고 더 많은 값을 추가할수록 Math가 더 많이 승리합니다. 하지만 ... 성능이 중요하기 전에 수십억 번의 비교가 필요합니다.
Jens

153

다음을 사용할 수 있습니다 Enumerable.Max.

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

2
.NET으로 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, 적은 매개 변수를 오버로드 : 그것이 정적하게, 당신은 너무 효율을 높일 수 있습니다.
Jon Skeet

1
@Jon Skeet : 우리는 정말로 이와 같은 하나의 라이너에 대한 함수를 작성해야합니까?
naveen

5
@naveen : 코드를 더 명확하게 만들고 여러 곳에서 사용하고 있다면 당연합니다. 왜 안돼?
Jon Skeet 2011

@Jon Skeet : 명확히 해주셔서 감사합니다. 그것은 내가 오랫동안 가지고 있었던 디자인 의심이었다. to or not to :)
naveen

12

일반

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

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

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 of 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.