VB.NET奇怪的排序行为?

时间:2010-06-22 19:08:47

标签: 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("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

我创建了以下数据的ArrayList(在输入时没有排序):

 0.000    1.000
 1.000    2.000
 2.000    9.000
20.070    6.788

然后我调用包含我的对象的ArrayList的.sort()方法。我得到的输出是

 0.000    1.000
 1.000    2.000
20.070    6.788
 2.000    9.000

但是,如果在我的compareTo我交换-1和1,我得到以下输出:

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

1 个答案:

答案 0 :(得分:1)

不知道你做错了,因为我不知道这些英里日志应该是什么意思(见下一段)。至少我可以指出你所看到的行为。在第一个.sort()调用中,首先比较第一个数字(让我们看看问题2.000和20.070的行)。 2.000不大于20.070,等于假,但OrElse等于真(9.000> 6.788),并返回1。

您确定您的输入数据是否正常?我把它读作起点和终点。你怎么能从@ mile 20.070开始并以6.788英里结束(向后走?)。如果数据不好,那么你的功能可能很好。另外,您可能只想专注于比较一列或另一列。