比较两个未知类型的对象在.NET中进行排序

时间:2014-12-05 16:01:14

标签: c# arrays sorting compare

我的任务:我有一个对象值数组,我需要对它们进行排序。在大多数情况下,值具有相同的原始数据类型(Int32,DateTime或String);但是,在其他情况下,我们可以在这个数组中有几种类型的数据(比如整数和几个字符串)。存储在数组中的值的类型在编译时是未知的。

为了解决这个任务,我编写了一个自定义比较器,用于相应的`Array.Sort(Array array,IComparer comparer))'调用。比较两个对象值的方法如下所示:

public static int CompareObjects(object valueX, object valueY)
{
    IComparable myValueX = valueX as IComparable;
    IComparable myValueY = valueY as IComparable;
    if (myValueX == null)
    {
        if (myValueY == null)
            return 0;
        return -1;
    }
    if (myValueY == null)
        return 1;

    if (!Type.Equals(myValueX, myValueY))
        return string.CompareOrdinal(myValueX.GetType().Name, myValueY.GetType().Name);

    return myValueX.CompareTo(myValueY);
}

我的测试表明这种方法是瓶颈,我需要加快速度。有没有更快的方法来比较两个未知类型的值?

1 个答案:

答案 0 :(得分:0)

如果您不需要主要按其类型名称排序的对象(功能成本的很大一部分),这将修复类型比较错误,并在一个简单的测试用例中使用不同的类型来实现{{ 1}},也提供了25%的测量性能提升(在没有IComparable优化的情况下相同的功能):

Type.GetHashCode()

请注意,此实现也存在问题,因为它没有正确比较不会从IComparable继承的对象。这对您来说可能是也可能不是问题。

对于怀疑者来说,这是一个简单的程序,证明比较类型上的GetHashCode()是一种性能改进:

    public static int CompareObjects(object valueX, object valueY)
    {
        IComparable myValueX = valueX as IComparable;
        IComparable myValueY = valueY as IComparable;
        if (myValueX == null)
        {
            if (myValueY == null)
                return 0;
            return -1;
        }
        if (myValueY == null)
            return 1;
        Type typeX = valueX.GetType();
        Type typeY = valueY.GetType();
        if (!typeX.Equals(typeY))
        {
            int ret = typeX.GetHashCode().CompareTo(typeY.GetHashCode());
            if (ret != 0) return ret;
            return string.CompareOrdinal(typeX.Name, typeY.Name);
        }

        return myValueX.CompareTo(myValueY);
    }