排序清单(Of T)提前停止

时间:2016-09-18 00:24:09

标签: vb.net list sorting

我有一个名为SaveFile的自定义类。它拥有的一个属性是SaveNumber,我试图按该属性对列表进行排序。我在这里阅读了一堆文章并得到了正确排序但是它提前停止了?我注意到这种情况的情况是有79次保存的集合。它将排序:1,2,3,4,5,6,7,10,11,... 30,8,31,... 70,9,71,..我使用的代码是

saveList.Sort(Function(x, y) x.CompareTo(y)

但如果我使用代码:

For i = 0 To 3
    saveList.Sort(Function(x, y) x.CompareTo(y))
Next

然后它排序正确,但它需要很长时间,一组有超过700个SaveFiles,所以我的程序加载需要将近5分钟。有什么想法吗?

这是我对CompareTo函数的代码:

Public Function CompareTo(y As SaveFile) As Integer Implements IComparable(Of SaveFile).CompareTo



    'If neither are an autosave then compare save number
    If Not Me.Text.StartsWith("autosave") And Not y.Text.StartsWith("autosave") Then

        If Me.SaveNumber.ToString.Length > y.SaveNumber.ToString.Length Then
            Return False
        ElseIf Me.SaveNumber.ToString.Length < y.SaveNumber.ToString.Length Then
            Return True
        End If

        Return Me.SaveNumber < y.SaveNumber
        'if either is an autosave
    Else
        'Create to comparable integers with
        'a value of 4. We set the value to
        '4 because it is higher than the 3
        'available autosaves, making it sort
        'after any autosaves if only one is
        'an autosave.
        Dim xComp As Integer = 4
        Dim yComp As Integer = 4

        'If x is an autosave then figure out
        'which autosave number it is.
        If Me.Text.StartsWith("autosave") Then
            Select Case True
                Case Me.Text.EndsWith("1")
                    xComp = 1
                Case Me.Text.EndsWith("2")
                    xComp = 2
                Case Me.Text.EndsWith("3")
                    xComp = 3
            End Select
        End If

        'if y is an autosave then figure out
        'which autosave number it Is.
        If y.Text.StartsWith("autosave") Then
            Select Case True
                Case y.Text.EndsWith("1")
                    yComp = 1
                Case y.Text.EndsWith("2")
                    yComp = 2
                Case y.Text.EndsWith("3")
                    yComp = 3
            End Select
        End If

        Return xComp < yComp
    End If
End Function

1 个答案:

答案 0 :(得分:0)

首先,在一篇文章中提出两个问题不是一个好主意,因为它减少了某人知道两者的答案的机会。例如,如果没有看到加载这些内容的代码甚至是它们的内容,那么只需要猜测加载这么长时间的原因。

对于排序,您的CompareTo方法存在缺陷。来自MSDN

  

将当前实例与同一类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是否在排序顺序中与其他对象相同的位置之前,之后或出现。

也就是说,它应该返回-1(先前),1(跟随)或0(相同)。您只需返回布尔值:

If Me.SaveNumber.ToString.Length > y.SaveNumber.ToString.Length Then
    Return False
ElseIf Me.SaveNumber.ToString.Length < y.SaveNumber.ToString.Length Then
    Return True
End If
...
Return xComp < yComp

我们不知道SaveNumber是什么类型,但是如果它是整数,那么比较字符串形式的长度,如果它与比较不一样:

' Me vs Other
Return "9".Length < "7".Length

当它按值返回False(0)时,它应该返回1。打开Option Strict会标记错误的返回类型,这可能会导致您回答。它应该是这样的,忽略了“自动”逻辑:

Public Function CompareTo(other As SaveItem) As Integer _
                  Implements IComparable(Of SaveItem).CompareTo

    ... special handling for "auto"

    If Me.SaveNumber = other.SaveNumber Then
        Return 0
    ElseIf Me.SaveNumber < other.SaveNumber Then
        Return -1
    Else
        Return 1
    End If

End Function

但是,您甚至可能不需要(假设SaveNumber是一个int):

saveItems = saveItems.OrderBy(Function(q) q.SaveNumber).ToList()
为了处理“自动保存”逻辑,可能需要

IComparable.CompareTo(),但可能会在OrderBy()中处理,具体取决于类公开的信息。