[英]Arithmetic comparison of objects in C#
我有两个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))
{
}
测试?
为此,有一个接口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
混合使用。
如果您“知道”可以比较类型,但是:
然后,可以通过使用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
碰巧是不知道如何进行比较的类型,则上面的代码将在运行时引发异常。
Convert.ToDouble(ox).CompareTo(Convert.ToDouble(oy));
如果其中之一不是数字,这当然会引发InvalidCastException
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.