2017-05-17 1 views
2

Ich muss generische vergleichen zwei primitive (numerische!) Typen (beide als Objekt boxed), um die größere zu finden. Ich kann Generics nicht verwenden, da ich nur Objekte erhalte, aber ich weiß, dass die ungepackten Werte primitive Zahlen sind (int, short, long, float usw.), also kann ich nach IComparable umwandeln.Dynamischer Vergleich der Boxed Primitive Werte

Wie kann ich diese vergleichen? CompareTo() gibt einen Fehler aus, weil sie unterschiedliche Typen sind, aber ChangeType kann eine OverflowException verursachen ...?

 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

Was meinst du mit "der Größere"? Ich meine angesichts der Tatsache, dass sie alle numerisch sind, nehme ich an, wir sprechen über den numerischen Vergleich richtig? Nur benötigt, um zu klären – kuskmen

+0

Ja, richtig :) danke für die Erinnerung, ich habe diese Informationen zur Beschreibung hinzugefügt – Robin

Antwort

1

Vielleicht so

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

Das Byte, short, int können Typen ohne Präzisionsverlust zu lange umgewandelt werden.

+0

ja, könnte dies eine Lösung sein ... aber diese Typen könnten anders sein ... so würde es qzue a geben viele manuelle Prüfungen notwendig .. - ist ein Doppel-oder Float -> konvertieren in Doppel - ist ein Int, kurz, Byte, Sbyte, Uint, Ushort, Lunge -> konvertieren zu lange - ist ein ulong? -> ulong? - ist eine Dezimalstelle? ->? ... und dann jede Möglichkeit kombinieren ... (+ in manchen Fällen ist "<" Vergleich nicht erlaubt) ... Deshalb suchte ich nach einem allgemeineren Ansatz ... – Robin

+0

ok, ich denke deine Lösung ist immer noch das Beste, wie hier vorgeschlagen: https://msdn.microsoft.com/de-de/library/system.valuetype(v=vs.110).aspx Tank you! – Robin

Verwandte Themen