2017-05-17 18 views
2

두 개의 프리미티브 (숫자!) 유형 (둘 다 객체로 표시됨)을 비교하여 더 큰 것을 찾아야합니다. 개체 만 가져 오기 때문에 제네릭을 사용할 수 없지만 unboxed 값은 int, short, long, float 등의 원시 숫자이므로 IComparable로 캐스팅 할 수 있습니다.박스형 프리미티브 값의 동적 비교

어떻게 비교할 수 있습니까? CompareTo()는 다른 유형이기 때문에 오류가 발생하지만 ChangeType은 OverflowException을 유발할 수 있습니다 ...?

 public static int Compare(object value1, object value2) 
    { 
     //e.g. value1 = (object)(int)1; value2 = (object)(float)2.0f 
     if (value1 is IComparable && value2 is IComparable) 
     { 
      return (value1 as IComparable).CompareTo(value2); 
      //throws exception bc value1.GetType() != value2.GetType() 
     } 
     throw new ArgumentException(); 
    } 
+0

"더 큰 것"은 무엇을 의미합니까? 나는 그들이 모두 숫자라는 사실을 감안할 때 우리는 숫자 비교에 대해 이야기하고 있다고 가정한다. 단지 – kuskmen

+0

을 명확히 할 필요가 있습니다. 맞습니다. 미리 알림을 주셔서 감사합니다. 설명에이 정보를 추가했습니다. – Robin

답변

1

는 어쩌면 그렇게

public static int Compare(object value1, object value2) 
{ 
    if (value1 is double || value2 is double) 
    { 
     double d1 = Convert.ToDouble(value1); 
     double d2 = Convert.ToDouble(value2); 
     return d1.CompareTo(d2); 
    } 

    if (value1 is float || value2 is float) 
    { 
     float f1 = Convert.ToSingle(value1); 
     float f2 = Convert.ToSingle(value2); 
     return f1.CompareTo(f2); 
    } 

    long x1 = Convert.ToInt64(value1); 
    long x2 = Convert.ToInt64(value2); 
    return x1.CompareTo(x2); 
} 

바이트, 짧은 형태의 정밀 손실없이 긴로 변환 할 수 있습니다 int로.

+0

예, 이것은 해결 될 수 있지만 ... 그 유형은 다를 수 있습니다 ... 그래서 qzuite는 많은 수동 수표가 필요합니다. - 하나의 double 또는 float -> double로 변환 - int, short, byte, sbyte, uint, ushort, lung ->로 변환 - 하나의 ulong입니까? -> ulong? - 하나의 십진수입니까? ->? ... 모든 가능성을 결합하는 것보다 ... (어떤 경우에는 "<"비교가 허용되지 않습니다) ... 왜 내가 좀 더 일반적인 접근 방식을 찾고 있었는지 ... – Robin

+0

좋습니다, 당신의 해결책이 있다고 생각합니다. 여전히 최선의 제안은 다음과 같습니다. https://msdn.microsoft.com/de-de/library/system.valuetype(v=vs.110).aspx Tank you! – Robin