VB.NET奇怪的排序行为?
我有一个重载如下的类:VB.NET奇怪的排序行为?,vb.net,sorting,arraylist,Vb.net,Sorting,Arraylist,我有一个重载如下的类: Public Overloads Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo ' I want a logmile, darn it! If Not TypeOf obj Is Logmile Then Throw New ArgumentException If Me("beg_logmile") > obj("be
Public Overloads Function CompareTo(ByVal obj As Object) As Integer Implements IComparable.CompareTo
' I want a logmile, darn it!
If Not TypeOf obj Is Logmile Then Throw New ArgumentException
If Me("beg_logmile") > obj("beg_logmile") OrElse Me("end_logmile") > obj("end_logmile") Then
' I start or end after the other guy
Return 1
ElseIf Me("beg_logmile") < obj("beg_logmile") OrElse Me("end_logmile") < obj("end_logmile") Then
' I start or end before the other guy
return -1
Else
' Well, we must be equivalent then!
Return 0
End If
End Function
瞧!这是按我期望的方式订购的!正好相反
所以我的问题是:我是否发现了一个bug,或者我只是做得不对
谢谢
编辑:
结论——我的逻辑写错了
更新的逻辑:
If Me("beg_logmile") > obj("beg_logmile") OrElse Me("beg_logmile") = obj("beg_logmile") and Me("end_logmile") > obj("end_logmile") Then
' I start or end after the other guy
Return 1
ElseIf Me("beg_logmile") < obj("beg_logmile") OrElse Me("end_logmile") = obj("end_logmile") and Me("end_logmile") < obj("end_logmile") Then
' I start or end before the other guy
Return -1
Else
' Well, we must be equivalent then!
Return 0
End If
如果我(“beg_logmile”)>obj(“beg_logmile”)或我(“beg_logmile”)=obj(“beg_logmile”)和我(“end_logmile”)>obj(“end_logmile”),那么
“我跟在另一个人后面开始或结束
返回1
如果我(“beg_logmile”)
我不知道你是否做错了,因为我不知道这些里程记录是什么意思(见我的下一段)。至少我能指出你看到的行为。在第一个.sort()调用中,首先比较第一个数字(让我们看看问题2.000和20.070中的行)。2.000不大于20.070,这等于false,但OrElse等于true(9.000>6.788),并且返回1
您确定您的输入数据正常吗?我把这读作开始英里和结束英里。你如何从20.070英里开始,到6.788英里结束(向后走?)。如果数据是坏的,那么您的函数可能是好的。除此之外,您可能只想重点比较一列或另一列。是的,数据还可以-我实际上正在更新程序-其他人已经收集了规格(一个内部使用的web应用程序)。在与客户交谈之后,显然后退是可以的,所以我尝试允许“反向”数据。所以很明显,我的逻辑是错的。 0.000 1.000 1.000 2.000 20.070 6.788 2.000 9.000 20.070 6.788 2.000 9.000 1.000 2.000 0.000 1.000
If Me("beg_logmile") > obj("beg_logmile") OrElse Me("beg_logmile") = obj("beg_logmile") and Me("end_logmile") > obj("end_logmile") Then
' I start or end after the other guy
Return 1
ElseIf Me("beg_logmile") < obj("beg_logmile") OrElse Me("end_logmile") = obj("end_logmile") and Me("end_logmile") < obj("end_logmile") Then
' I start or end before the other guy
Return -1
Else
' Well, we must be equivalent then!
Return 0
End If