Compare方法出错

来源:互联网 发布:gta5优化最好的盗版 编辑:程序博客网 时间:2024/05/21 22:57

原文: http://blog.csdn.net/youngmumu/archive/2010/05/05/5559258.aspx

ps:写方法时,加一个相等 return 0;

 

{"当 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)  可能会引发以下两个异常

 

ArgumentNullException

comparison 为空引用;即list中有null的情况,Comparison<T> 是需要判断出来,并给出返回值。

 

list[3]=null. 当其他项与该项比较时,没有判断就会引发该异常。所以在comparison实例中需要判断  ValueA ,ValueB 中存在null的情况。

 

ArgumentException

在排序过程中, 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;
                            }    
                      
         }

原创粉丝点击