C# 装箱原语值的动态比较
我需要比较两个基本类型(数值!)(都作为对象装箱),以找到更大的一个。 我不能使用泛型,因为我只得到对象,但我知道未固定的值是原始数(int、short、long、float等),所以我可以转换为IComparable 我怎样才能比较这些呢?CompareTo()抛出错误,因为它们是不同的类型,但ChangeType可能导致OverflowExceptionC# 装箱原语值的动态比较,c#,object,primitive-types,boxing,icomparable,C#,Object,Primitive Types,Boxing,Icomparable,我需要比较两个基本类型(数值!)(都作为对象装箱),以找到更大的一个。 我不能使用泛型,因为我只得到对象,但我知道未固定的值是原始数(int、short、long、float等),所以我可以转换为IComparable 我怎样才能比较这些呢?CompareTo()抛出错误,因为它们是不同的类型,但ChangeType可能导致OverflowException public static int Compare(object value1, object value2) {
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();
}
也许是这样
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);
}
字节、短整型可以转换为长整型,而不会丢失精度。您所说的“大整型”是什么意思?我的意思是,考虑到它们都是数字,我想我们讨论的是数字比较,对吗?只是需要澄清是的,正确:)谢谢提醒,我已经将此信息添加到描述中,这可能是一个解决方案…但这些类型可能不同…因此需要大量手动检查是一个双精度还是浮点->转换为双精度-是一个int、short、byte、sbyte、uint、ushort、lung->转换为long-是一个ulong吗?->乌龙是一位小数吗?->。。。在某些情况下,“好吧,我认为你的解决方案仍然是最好的,正如这里所建议的:坦克你!