获取List.Sort()结果是错误的

时间:2015-12-01 18:57:22

标签: .net vb.net sorting

问题在于,当我使用X和Y All对点列表进行排序时,除了其中一个点与其他4个点具有相同X但具有最小Y点的点将被放置在列表中最后一个的索引位置。起初我只是确保排序执行了一次以上的刺激,因为所有点只移动了一个位置,而不是从列表中的位置开始。这是我与用于对列表进行排序的方法的比较:

Public Function CompareTo(ByVal other As Point) As Integer Implements System.IComparable(Of Point).CompareTo
        Dim xCompare As Integer = Me.X.CompareTo(other.X)
        If xCompare = 0 Then
            Return Me.Y.CompareTo(other.Y)
        End If
        Return xCompare
    End Function

分类后的项目

  

1:18.750,144.500

     

2:19.440,88.642

     

3:21.750,112.925

     

4:21.750,134.375

     

5:21.750,89.646

     

6:21.750,144.500

如您所见,5处的项目应移至列表中的第3项。

2 个答案:

答案 0 :(得分:3)

您的比较算法没有任何逻辑错误。您的实际浮点值略有不同似乎是合理的,从而导致您观察到的顺序。我建议在比较时添加“相等”值的容差,可能通过舍入到比方说3位小数:

Public Function CompareTo(ByVal other As Point) As Integer Implements System.IComparable(Of Point).CompareTo
        Dim xCompare As Integer = Math.Round(Me.X,3).CompareTo(Math.Round(other.X,3))
        If xCompare = 0 Then
            Return Math.Round(Me.Y,3).CompareTo(Math.Round(other.Y,3))
        End If
        Return xCompare
    End Function

3位小数的选择是任意的;我只选择它,因为那是你展示的。使用更多小数将保留更多“真实”差异,但会增加由于浮点不准确而导致误报的可能性。

答案 1 :(得分:0)

我以为你不明白Sort是如何运作的。

通过您的代码示例,您认为必须多次调用sort才能对List的所有元素进行排序。但这不是真的。

调用它一次对List中的所有元素进行排序。如果在排序后添加元素或更改元素的值,则可能需要再次调用sort。因此,判断排序过程是否正在进行是毫无意义的 - 您的代码将继续运行,直到所有元素的顺序正确。

内置排序功能也经过优化,以尽可能快。如果你打电话给它并且一切都已经按照正确的顺序排列,那么处理能力就会很小 - 它只会确认一切都井然有序。