2011-08-24 4 views
3

j'ai une fonction qui prend deux paramètres et renvoie true si elles sont égales ou faux si elles ne sont pas:comparer les différents types (nombre-int, float, double, ...) dans .NET

private bool isequal(object a, object b) 
{ 
    if (a != null) 
     return a.Equals(b); 
    if (b != null) 
     return b.Equals(a); 
    //if (a == null && b == null) 
     return true; 
} 

Maintenant, je veux étendre cette fonction. Il devrait aussi retourner vrai si a et b sont 2 nombres égaux mais de type différent.

Par exemple:

int a = 15; 
double b = 15; 
if (isequal(a,b)) //should be true; right now it's false 
{ //... 
} 

Je l'ai déjà trouvé une question similaire (avec réponse) best way to compare double and int mais a et b pourrait être tout type de numéro ou quelque chose d'autre que des chiffres. Comment puis-je vérifier si a et b sont numériques? J'espère qu'il ya une meilleure façon de vérifier que tous les types numériques existants de .net (Int32, Int16, Int64, UInt32, Double, décimal ...)

// mise à jour: J'ai réussi à écrire une méthode qui fonctionne plutôt bien. Cependant, il pourrait y avoir quelques problèmes avec les nombres du type décimal (ne l'ont pas encore testé). Mais cela fonctionne pour tous les autres types numériques (y compris les nombres élevés de Int64 ou UInt64). Si quelqu'un est intéressé: code for number equality

+0

Je pense que vous tentez l'impossible. Comment pouvez-vous comparer Int64.MaxValue avec un float ou double et s'attendre à atteindre l'égalité. Il n'y a pas assez de précision disponible. –

+0

Je ne m'attendais jamais à ça. Int64.MaxValue et une certaine valeur flottante ne seront bien sûr jamais égales. Mais je m'attends à ce qu'il fonctionne correctement pour toutes les combinaisons possibles (Int64.MaxValue! = Int64.MaxValue-1 étant l'un d'entre eux) – Preli

Répondre

3

Vous pouvez utiliser Double.TryParse sur a et b. Il traitera int, long, etc.

private bool isequal(object a, object b) 
{ 
    if (a == null || b == null) 
     return (a == b); 

    double da, db; 
    if (Double.TryParse(a.ToString(), out da) && Double.TryParse(b.ToString(), out db)) 
     return YourIsDoubleEqualEnough(da, db); 

    return false; 
} 
+0

Le code Double.TryParse ne sera atteint que si un b AND est null ce qui conduira à une exception NullReferenceException! – Preli

+0

Vous avez raison. J'ai changé la vérification nulle dans le code ci-dessus pour refléter cela. – Donald

0

essayer

private bool isequal(object a, object b) 
{ 
int c,d; 
     if (int.TryParse(a.ToString(), out c) && int.TryParse(b.ToString(), out d)) 
     { 
      if (c == d) 
       return true; 
     } 
if (a != null) 
    return a.Equals(b); 
if (b != null) 
    return b.Equals(a); 
//if (a == null && b == null) 
    return true; 
} 
+0

Cela produira une exception NullReferenceException si a ou b sont nuls (à cause de a.ToString()). Cela ne fonctionnera pas non plus si a et b sont flottants ou décimaux. – Preli