2012-03-15 3 views
19

나는 3 개 값 사이에 최소를 찾을 필요, 나는이 같은 일을 결국 :왜 C#의 Math.Min/Max 변수가 아닌가?

Math.Min(Math.Min(val1, val2), val3) 

그냥 나에게 조금 바보 같다, 다른 언어는이를 위해 가변 기능을 사용하기 때문이다. 나는 이것이 비록 감독 이었는지는 의심 스럽다.

간단한 Min/Max 기능이 가변적 인 이유는 무엇입니까? 성능에 영향이 있습니까? 내가 알지 못하는 variadic 버전이 있습니까?

+2

원하는 항목이 아니지만 LINQ에는 IEnumerable에 대한 최소 확장자가 있습니다. –

+7

Variadic 함수를 호출하면 배열이 할당됩니다. 이것은 단순한 최소/최대에 대해 너무 많은 오버 헤드로 간주되었을 수 있습니다. – arx

답변

30

이 모음 (IEnumerable<T>의 서브 클래스) 하나 쉽게 System.Linq 라이브러리 기능을 사용할 수 인 경우

int min = new int[] {2,3,4,8}.Min(); 

또한 그것은 자신에 이러한 방법을 쉽게 구현할 수 :

public static class Maths { 

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

} 

을 간단한 스칼라만으로이 메서드를 호출 할 수 있으므로 Maths.Min(14,25,13,2)2이됩니다.

은 일반적인 방법, 그래서 숫자의 각 유형에 대해이 방법을 구현하기 위해 필요 ( int, float를, ...)

나는 이러한 방법은 일반적으로 구현되지 않은 이유는 기본적인 이유를 생각이 없다 이 메서드는 배열을 호출 할 때마다 (또는 적어도 IList 개체를 만들어야합니다. 낮은 수준의 메서드를 유지함으로써 오버 헤드를 피할 수 있습니다. 그러나 이러한 메서드를 Math 클래스에 추가하여 일부 프로그래머가 더 쉽습니다.

+0

-1이 답변은 질문의 성격에 맞지 않습니다. –

+2

지금 생각해 보면, 대부분의 사람들은 실용적인 해결책을 원합니다. 이론적 컴퓨터 과학 및 프로그래밍 언어 패러다임을위한 다른 스택 교환 사이트가 있습니다. –

+1

@CommuSoft : 그가 어떻게해야하는지 물어 본다면 원래의 대답이 효과가 있었지만 그는 이유를 묻습니다. 질문을해야하는 곳은 논쟁의 여지가 있지만 일반적으로 특정 API에 대한 추상적 인 질문은 허용됩니다. 분명히이 질문은 컴퓨터 과학에 대한 일반적인 질문이 아니기 때문입니다. (사람이 하나가 될 수는 있지만 ...) – Guvante

8

CommuSoft는 C#에서 이와 동등한 작업을 수행하는 방법을 설명 했으므로 r 그 부분을 털어 놓으십시오.

"왜 C#의 Math.Min/Max 변수가 아닌가?"라는 두 가지 생각을 염두에 두어야합니다.

먼저 Math.Min (및 Math.Max)은 실제로 C# 언어 기능이 아니며 .NET Framework 라이브러리 기능입니다. 그것은 현학적으로 보일지 모르지만 중요한 구분입니다. 실제로 C#은 두 가지 이상의 잠재적 인 값 사이의 최소값 또는 최대 값을 결정하기위한 임의의 특수 목적 언어 기능을 제공하지 않습니다.

둘째, 에릭 리 퍼트 (Eric Lippert)가 여러 번 지적했듯이 언어 기능 (아마도 프레임 워크 기능)은 "제거"되거나 적극적으로 제외되지 않습니다. 모든 기능은 설계, 구현, 테스트, 문서 및 배송이 완료 될 때까지 구현되지 않습니다. 특색. See here for an example.

. .NET 프레임 워크 개발자가 아니기 때문에 실제로 발생한 의사 결정 프로세스에 대해 말할 수는 없지만 단순히 foreach 시퀀스와 마찬가지로 포함 수준까지 결코 상승하지 않는 기능의 고전적인 사례 인 것처럼 보입니다. Eric은 제공된 링크에서 "기능"에 대해 설명합니다.

+1

그래, 그게 좀 현학적인데, 그게 내가 바라는거야. 내장 언어와 라이브러리 기능의 차이점을 알고 있습니다. (수학에 네임 스페이스가 적용됩니다.) .NET과 Mono (거의 동일한 표준 라이브러리가있는 두 가지 주요 구현)를 말 했어야합니다. 알맞은 연결, BTW. 그 경우에는 – tjameson

+0

@tjameson을 사용하십시오. 제목으로 제목과 태그를 변경하고 싶은 경우가 있습니다. 감사. – JeremyDWill

+0

정말 괴롭히는 경우 계속 편집하십시오. 나는 제목을 너무 길게 만들지 않으면 서 .NET과 Mono를 포함시키는 방법을 생각할 수 없다. 나는 그것이 얼마나 좋은지 생각합니다. 표준 라이브러리에서 동일한 기능을 갖고 있지 않은 C# 구현을 인식하지 못합니다. – tjameson

2

필자는 CommuSoft가 이러한 라인을 따라 무언가를 검색하는 사람들에게 적합한 확실한 대답을 제공한다고 생각합니다.

그 이유는 확실히 에 필요한 오버 헤드를 줄이기 위해서입니다. 두 가지 값보다는 그룹을 비교하려는 유스 케이스.

@arx가 지적한 것처럼 매개 변수를 사용하면 가장 많이 사용되는 경우에 불필요한 오버 헤드가 발생하지만 내부적으로 사용해야하는 루프와 관련하여 불필요한 오버 헤드가 많이 발생합니다. 배열 n - 1 번.

기본 양식 외에도 메서드를 만들었지 만 더 이상 필요하지 않은 LINQ가있는 인수를 쉽게 볼 수 있습니다.

관련 문제