繁体   English   中英

C#中对象的算术比较

[英]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 : ))

重要提示:在所有这些情况下, oxoy必须为同一类型(或null )。 您不能将intdouble混合使用。

如果您“知道”可以比较类型,但是:

  1. 您不知道确切的类型(无反射)
  2. 你不知道它们是否是同一类型

然后,可以通过使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM