在不同的.NET类型(例如int与double)上使用CompareTo()
我有一个静态方法,它接受两个对象类型变量并运行CompareTo方法:在不同的.NET类型(例如int与double)上使用CompareTo(),.net,types,double,int,compareto,.net,Types,Double,Int,Compareto,我有一个静态方法,它接受两个对象类型变量并运行CompareTo方法: public static int Compare(Object objA, Object objB) { return (((IComparable)objA).CompareTo(objB)); } 问题是CompareTo在尝试比较不同类型(例如int和double)时抛出异常。 有谁知道C语言中比较两种不同类型的语言更好的方法吗? 还是解决这个问题的方法 谢谢在C中没有通用的方法来解决这个问题,因为没有通用的
public static int Compare(Object objA, Object objB)
{
return (((IComparable)objA).CompareTo(objB));
}
问题是CompareTo在尝试比较不同类型(例如int和double)时抛出异常。
有谁知道C语言中比较两种不同类型的语言更好的方法吗?
还是解决这个问题的方法
谢谢在C中没有通用的方法来解决这个问题,因为没有通用的解决方案。若并没有信息丢失,C编译器将隐式地将一种类型转换为另一种类型,然后比较它们。在任何其他情况下,这将引发异常
在本例中,实现接口的程序员负责决定两个对象是否具有可比性,而作为类的用户,您对这一点没有影响。在C中没有解决该问题的通用方法,因为没有通用的解决方案。若并没有信息丢失,C编译器将隐式地将一种类型转换为另一种类型,然后比较它们。在任何其他情况下,这将引发异常
在本例中,实现接口的程序员负责决定两个对象是否具有可比性,而您作为类的用户对此没有影响。一种可能的解决方法是通过反射使用IComparable接口:
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类型时才会工作。一个可能的解决方法是通过反射使用IComparable接口:
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类型时才会起作用。如果只处理数值,您可以使用以下方法解决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是不需要任何检查的I可比较的,并且您必须保证所涉及的类型之间有相互转换。如果只处理数值,您可以使用以下方法解决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是不需要任何检查的i可比较的,并且您必须保证所涉及的类型之间确实存在相互转换。如果您只是比较数字,这将适用于大多数情况:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB)));
}
如果您只是比较数字,这将适用于大多数情况:
public static int Compare(Object objA, Object objB)
{
return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB)));
}
要做到这一点,您必须构建自己的逻辑,主要是因为只有您知道底层比较应该做什么 e、 g以你为例,比较
int i = 10;
double d = 10.2;
这些是平等的吗?是否应将整数提升为双精度,然后进行比较?那么不,不相等。
应该将double截断为整数吗?那么是的,他们是平等的
在静态方法中,需要检查A和B的类型是否相同,如果相同,则可以调用A.compareTob
如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案
希望这对你有所帮助,你必须建立自己的逻辑来做这件事,主要是因为只有你知道潜在的比较应该做什么 e、 g以你为例,比较
int i = 10;
double d = 10.2;
这些是平等的吗?是否应将整数提升为双精度,然后进行比较?那么不,不相等。
应该将double截断为整数吗?那么是的,他们是平等的
在静态方法中,需要检查A和B的类型是否相同,如果相同,则可以调用A.compareTob
如果没有,那么您需要决定如何比较不同的类型,并在静态方法中实现该解决方案
希望这有帮助