我的任务:我有一个对象值数组,我需要对它们进行排序。在大多数情况下,值具有相同的原始数据类型(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);
}
我的测试表明这种方法是瓶颈,我需要加快速度。有没有更快的方法来比较两个未知类型的值?
答案 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);
}