2012-03-25 3 views
3

매개 변수 집합 중 가장 큰 값을 제공하는 제네릭 함수를 정의하려고합니다.부분 순서 지정을위한 IComparable 형식 인터페이스

public static TResult Max<TResult>(params TResult[] items) 
    { 
     TResult result = items[0]; 
     foreach (var item in items) 
     { 
      if (item > result) 
       result = item; 
     } 
     return result; 
    } 

"item> result"행에서 컴파일러가 작동하지 않는다는 점을 제외하고는 모두 훌륭합니다. 내가 필요한 건 TResult가> 연산자 (또는 <도 작동하도록)를 제한하는 방법입니다. 그러나이 작업을 수행하기 위해 쉽게 사용할 수있는 인터페이스는 없습니다. 이것은 부분 순서이므로 꽤 일반적인 작업처럼 보입니다. 거대한 .NET 문서에서 뭔가 빠졌습니까?

+5

총 주문 (즉, 'IComparable')이 여기에 적합하지 않은 이유는 무엇입니까? –

+0

linq을 사용할 수 있습니까? –

답변

5

당신은 IComparable을 사용할 수

public static IComparable Max<TResult>(params IComparable[] items) 
{ 
    IComparable result = items[0]; 
    foreach (var item in items) 
    { 
     if (item.CompareTo(result) > 0) 
      result = item; 
    } 
    return result; 
} 
+1

OP에서 'IComparable'을 사용하지 않는 것 같습니다. 왜 안되는지 아는 것은 흥미로울 것입니다 ... –

+0

@Konrad Rudolph : 맞습니다. 텍스트에서 분명히 이유는 분명하지 않지만, 제목을 다시 읽었습니다. – Tudor

+2

아니요, OP는 설명서를 올바르게 읽지 않은 바보 같은 엉덩이입니다. @ 튜더는 내가 원했던 것과 똑같은 덕택입니다. –

2

는 부분적인 순서를 suppport에는 인터페이스가 없습니다. 제너릭에서 연산자를 사용할 수도 없습니다.

가장 일반적인 솔루션 - 통과 비교기 방법 대리인.

IComparable 또는 IComparer 인터페이스의 일부만 사용하여 "this is greater than thant that"라는 인터페이스를 사용하고 다른 두 값은 무시할 수 있습니다.

IComparableIComparer<in T> LINQ 쿼리를 통해 사용됩니다. 나는. OrderBy을 참조하십시오.

관련 문제