{"当 Array.Sort 调用 x.CompareTo(x) 时,IComparer (或其依赖的 IComparable 方法)未返回零。x:“SGGM.Attribute.cRow”x 的类型:“cRow”IComparer:“System.Array+FunctorComparer`1[SGGM.Attribute.cRow]”。"}
因为发现该排序不稳定,当比较的值相等时 ,会出现重新排序的现象。所以做了如下调整,结果出现以上错误
private int comparison(Tvalue ValueA,Tvalue ValueB)
{
if( ValueA>ValueB)// compare 方法比较的是同一个引用时返回0
{
return 1;
}
else
{
return -1;
}
}
在MSDN中查到
在list排序方法中 public void Sort (Comparison<T> comparison) 可能会引发以下两个异常
comparison 为空引用;即list中有null的情况,Comparison<T> 是需要判断出来,并给出返回值。 |
list[3]=null. 当其他项与该项比较时,没有判断就会引发该异常。所以在comparison实例中需要判断 ValueA ,ValueB 中存在null的情况。
在排序过程中, comparison 的实现会导致错误。例如,当将一项与其自身比较时,comparison 可能不返回 0,此时引发该异常。 |
因为sort方法法使用 System.Array.Sort,后者使用 QuickSort 算法。此实现执行不稳定排序;亦即,如果两元素相等,则其顺序可能不被保留。相反,稳定排序保留相等元素的顺序。所以实例应判断出 ValueA = ValueB 的情况,并返回-1,即保留原有的顺序。但是该排序方法还要和 自己比较即 调用方法 x.CompareTo(x) ,所以comparison委托实例需要判断出这种情况 返回0
private int comparison(Tvalue ValueA,Tvalue ValueB)
{
if (ValueA.Equals(ValueB)) // compare 方法比较的是同一个引用时返回0
{
return 0;
}
if (ValueA== null)//可以做到始终将null值做为小值排序。
{
nResult = -1;
}
else
{
nResult = 1;
}
}