2017-05-17 43 views
2

J'ai besoin de comparer deux types primitifs (numériques!) (Tous deux encadrés en tant qu'objet) pour trouver le plus grand. Je ne peux pas utiliser de génériques, car je ne reçois que des objets, mais je sais que les valeurs non-boxées sont des nombres primitifs (int, short, long, float etc), donc je peux lancer vers IComparable.Comparaison dynamique des valeurs primitives encadrées

Comment puis-je les comparer? CompareTo() renvoie une erreur car il s'agit de types différents, mais ChangeType peut provoquer une exception 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

Qu'entendez-vous par "le plus grand"? Je veux dire étant donné qu'ils sont tous numériques, je suppose que nous parlons de la comparaison numérique droite? Juste besoin de clarifier – kuskmen

+0

Oui, correct :) merci pour le rappel, j'ai ajouté cette information à la description – Robin

Répondre

1

Peut-être que si

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

L'octet, short, int types peuvent être convertis en temps sans perte de précision.

+0

oui, cela pourrait être une solution ... mais ces types pourraient être différents ... donc il y aurait qzuite un beaucoup de contrôles manuels nécessaires .. - est un double ou float -> convertir en double - est un int, court, octet, sbyte, uint, ushort, poumon -> convertir en long - est un ulong? -> ulong? - est une décimale? ->? ... Et que de combiner toutes les possibilités ... (+ dans certains cas "<" comparaison n'est pas autorisée) ... C'est pourquoi je cherchais une approche plus générique ... – Robin

+0

ok, je pense que votre sollicution est toujours le meilleur, comme suggéré ici: https://msdn.microsoft.com/de-de/library/system.valuetype(v=vs.110).aspx Vous réservoir! – Robin