代码里面有一个DateTime的List,现在算法中要先对该List做排序,所以调用了List的Sort()方法:
DateTimeList.Sort((p1,p2)=>DateTime.Compare(p1,p2))
现在在生产环境每天都会报少量如下的错误:
System.ArgumentException: Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. IComparer:
at System.Collections.Generic.IntrospectiveSortUtilities.ThrowOrIgnoreBadComparer(Object comparer)
at System.Collections.Generic.ArraySortHelper`1.Sort(T[] keys, Int32 index, Int32 length, IComparer`1 comparer)
at System.Collections.Generic.List`1.Sort(Comparison`1 comparison)
说是不能比较,因为比较结果有不确定性,但是日期这种东西不能比较有些奇怪,求教大神解答!
是不是当时比较时其中有一个值为null
应该不会,dateTime不能为空的啊,默认的话也是0001-01-01
list.Sort((x, y) => y.CompareTo(x)); 试试这个,如果不对,估计你列表的数据有问题
排序直接sort()不就好了,你传这个比较器是想干嘛
我把问题简化了抛出来了,实际list里面是一个class,是用class里面的一个dateTime成员做比较的。
看到这个问题这么久都没有人回答 ,那么我来回答下吧。刚刚解决这个问题
首先 如果你自己写个排序 冒泡排序也好 啥也好 那么如果报错了 你肯定找得到原因 因为代码提示就在那里。
表面提示像是sort 底层匹配两个元素 出现问题 (比如其中一个元素为null )
但是如果你用这个sort 委托的方式 如果不深入理解的话就会掉坑。总之是你sort里面的委托 代码有问题 ,没有正确区分出 哪个大 哪个小 哪种相等 , 运行到最后 导致逻辑出现混乱 (最后导致sort委托里 比较的两个元素 有为空的 ,正常情况下 应该 始终 不可能出现 任意比较的对象为空的情况 ,特别是排序元素个数为奇数的时候)