我有两个object
个实例,可以是整数或双精度数。我想找出哪个更小:
int ix = 1;
int iy = 2;
object ox = ix;
object oy = iy;
if (ox < oy) // This is an error
{
...
}
是否可以在没有看起来效率低下的情况下执行此比较
if (ox.GetType() == typeof(int))
{
}
else if (ox.GetType() == typeof(double))
{
}
测试?
答案 0 :(得分:4)
有一个界面IComparable,用于
定义一个通用的特定于类型的比较方法,值类型或类实现它以对其实例进行排序或排序。
和
所有数字类型(如Int32和Double)都实现IComparable,String,Char和DateTime也是如此。自定义类型还应提供自己的IComparable实现,以便对对象实例进行排序或排序。
你可以写......
int ix = 1;
int iy = 2;
object ox = ix;
object oy = iy;
IComparable cx = ox as IComparable;
// Does our type supports comparison?
if (cx == null && ox != null)
{
throw new NotSupportedException();
}
if ((cx != null && cx.CompareTo(oy) < 0) || (ox == null && oy != null)) // x < y
{
}
请注意ox == null
嗯...更短......
int cmp = System.Collections.Comparer.Default.Compare(ox, oy);
if (cmp < 0) {
}
似乎System.Collections.Comparer
完成了所有必要的工作(使用IComparable
界面)
您甚至可以使用
int cmp = System.Collections.Generic.Comparer<object>.Default.Compare(ox, oy);
object
类型不支持IComparable<object>
,因此将使用IComparer
接口(事实上,在.NET 4.5实现中,Comparer<object>.Default
会使用前一个例子的Comparer.Default
:-))
重要提示:在所有这些情况下,ox
和oy
必须属于同一类型(或null
)。您不能混用int
和double
。
答案 1 :(得分:1)
如果你&#34;知道&#34;这些类型可以比较,但是:
然后,使用dynamic
:
void Main()
{
int ix = 1;
int iy = 2;
dynamic ox = ix;
dynamic oy = iy;
if (ox < oy)
Debug.WriteLine("ox < oy");
else if (ox == oy)
Debug.WriteLine("ox == oy");
else
Debug.WriteLine("ox > oy");
}
请注意,dynamic
在很多情况下类似于object
,但会延迟到运行时的确切绑定和处理。这意味着如果ox
和/或oy
恰好是不知道如何比较的类型,上面的代码会在运行时抛出异常。
答案 2 :(得分:0)
Convert.ToDouble(ox).CompareTo(Convert.ToDouble(oy));
如果其中一个不是数字,这当然会抛出InvalidCastException
。