C#中对象的算术比较

时间:2015-04-10 10:09:09

标签: 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))
{
}

测试?

3 个答案:

答案 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 :-))

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

答案 1 :(得分:1)

如果你&#34;知道&#34;这些类型可以比较,但是:

  1. 你不知道确切的类型(没有反思)
  2. 您不知道他们是否属于同一类型
  3. 然后,使用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