【发布时间】:2014-12-05 16:01:14
【问题描述】:
我的任务:我有一个对象值数组,我需要对它们进行排序。在大多数情况下,值具有相同的原始数据类型(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);
}
我的测试表明这种方法是一个瓶颈,我需要加快速度。有没有更快的方法来比较两个未知类型的值?
【问题讨论】:
-
Type.Equals并没有按照你的想法去做。 -
是否有理由需要根据名称字符串的序数排序不同的类型?在我看来,这就像一个性能狂。对不同类型的哈希码进行排序可能会有更好的结果,然后仅在哈希码相同时才使用字符串。 @SLaks:我认为
Type.Equals完全符合他的要求——因为他希望它们具有某种一致的排序方式。 -
@SLaks,为什么?我只需要区分两种不同的数据类型,如果它们不同就不要比较它们。也许,对于那个“如果”,一个更好的测试表达式是
myValueX.GetType() != myValueY.GetType()? -
@James,你是说
myValueX.GetHashCode().CompareTo(myValueY.GetHashCode())吗?为什么会更好? -
没有。我会做这样的事情: if (!Type.Equals(myValueX, myValueY)) { int ret = myValueX.GetType().GetHashCode().CompareTo(myValueY.GetType().GetHashCode());如果 (ret != 0) 返回 ret; return string.CompareOrdinal(myValueX.GetType().Name, myValueY.GetType().Name);这首先比较类型的哈希码,这比比较类型的名称要快得多,并且仅在哈希码相同的极少数情况下才使用比较名称。