在不同的.NET类型上使用CompareTo()(例如int与double)

时间:2010-03-08 10:26:50

标签: .net types double int compareto

我有一个静态方法接受两个对象类型变量并运行CompareTo()方法:

public static int Compare(Object objA, Object objB)
{
   return (((IComparable)objA).CompareTo(objB));
}

问题是CompareTo()在尝试比较不同类型(例如int和double)时会抛出异常。 有没有人知道C#中更好的方法,比较两种不同的类型? 或者解决这个问题?

由于

5 个答案:

答案 0 :(得分:2)

在C#中没有通用的方法来解决这个问题,因为它没有通用的解决方案。如果没有丢失信息,C#编译器将隐式地将一种类型转换为另一种类型然后进行比较。在任何其他情况下,这将抛出异常。

在这个例子中,实现IComplarable接口的程序员负责决定两个对象是否具有可比性,并且作为一个类的用户对此没有影响。

答案 1 :(得分:1)

可能的解决方法是使用IComparable<T>界面,通过反射:

public static int Compare(Object objA, Object objB)
{
    Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
    MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
    return (int)compareMethod.Invoke(objA, new[] { objB });
}

然而,它会更慢,只有在objB的类型可以转换为objA的类型时才会起作用。

答案 2 :(得分:1)

如果仅处理数值,您可以使用此方法为Nenad描述的问题提供解决方法:

public static int Compare(Object objA, Object objB)
{
    object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
    return (((IComparable)objA).CompareTo(objB_as_AType));
}

但要非常小心,因为你假设A是没有任何检查的IC Comparable,你必须保证所涉及的类型确实相互转换。

答案 3 :(得分:0)

如果您只是比较数字,这适用于大多数情况:

public static int Compare(Object objA, Object objB) 
{ 
   return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB))); 
} 

答案 4 :(得分:0)

你必须建立自己的逻辑才能做到这一点,主要是因为只有你知道底层比较应该做什么。

举个例子,比较

int i = 10;
double d = 10.2;

这些是平等的吗?是否应将整数提升为双数,然后进行比较?然后不,不相等 double应该被截断为整数吗?然后是的,他们是平等的。

在静态方法中,您需要检查A&amp; A的类型。 B是相同的,如果是这样,那么你可以调用a.compareTo(b)。

如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案。

希望这有帮助