Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 排序列表(共T个)提前停止_Vb.net_List_Sorting - Fatal编程技术网

Vb.net 排序列表(共T个)提前停止

Vb.net 排序列表(共T个)提前停止,vb.net,list,sorting,Vb.net,List,Sorting,我有一个名为SaveFile的自定义类。它的一个属性是SaveNumber,我正在尝试按该属性对列表进行排序。我在这里读了一堆文章,并对其进行了适当的排序,但它很早就停止了?我注意到这是一个有79次保存的集合。它会排序:1,2,3,4,5,6,7,10,11。。。30, 8, 31, ... 70, 9, 71, .. 我使用的代码是 saveList.Sort(函数(x,y)x.CompareTo(y)) 但如果我使用代码: For i = 0 To 3 saveList.Sort(F

我有一个名为SaveFile的自定义类。它的一个属性是SaveNumber,我正在尝试按该属性对列表进行排序。我在这里读了一堆文章,并对其进行了适当的排序,但它很早就停止了?我注意到这是一个有79次保存的集合。它会排序:1,2,3,4,5,6,7,10,11。。。30, 8, 31, ... 70, 9, 71, .. 我使用的代码是

saveList.Sort(函数(x,y)x.CompareTo(y)

但如果我使用代码:

For i = 0 To 3
    saveList.Sort(Function(x, y) x.CompareTo(y))
Next
然后进行正确排序,但这需要很长时间,其中一组有700多个保存文件,所以我的程序加载几乎需要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
公共函数CompareTo(y作为SaveFile)作为整数实现(SaveFile的)IComparable。CompareTo
'如果两者都不是自动保存,则比较保存编号
如果不是Me.Text.StartsWith(“自动保存”)而不是y.Text.StartsWith(“自动保存”),那么
如果Me.SaveNumber.ToString.Length>y.SaveNumber.ToString.Length,则
返回错误
ElseIf Me.SaveNumber.ToString.Length
首先,在一篇文章中问两个问题不是一个好主意,因为这样会减少有人知道两个问题答案的机会。例如,如果看不到加载这些东西的代码,甚至看不到它们是什么,就只能猜测为什么加载需要这么长时间

对于排序,您的
CompareTo
方法存在缺陷。发件人:

将当前实例与相同类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是在排序顺序中位于另一个对象之前、之后还是发生在同一位置

也就是说,它应该返回-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
它将返回
False
(0),当它按值运行时,它应该返回
1
。打开
选项Strict
会标记错误的返回类型,这可能会导致您找到答案。应该是这样的,忽略“自动”逻辑:


处理“自动保存”逻辑可能需要使用
IComparable.CompareTo()
,但根据类公开的信息,它可能可以在
OrderBy()中处理

首先,在一篇帖子中问两个问题不是一个好主意,因为这样会减少有人知道两个问题答案的机会。例如,如果看不到加载这些东西的代码,甚至看不到它们是什么,就只能猜测为什么加载需要这么长时间

对于排序,您的
CompareTo
方法存在缺陷。发件人:

将当前实例与相同类型的另一个对象进行比较,并返回一个整数,该整数指示当前实例是在排序顺序中位于另一个对象之前、之后还是发生在同一位置

也就是说,它应该返回-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
它将返回
False
(0),当它按值运行时,它应该返回
1
。打开
选项Strict
会标记错误的返回类型,这可能会导致您找到答案。应该是这样的,忽略“自动”逻辑:


处理“自动保存”逻辑可能需要使用
IComparable.CompareTo()
,但根据类公开的信息,它可能可以在
OrderBy()中处理

这实际上很有帮助。长度比较是因为我厌倦了2介于19和20之间。谢谢你解释CompareTo。我一直在努力理解它,我发现的示例返回的布尔值与我的一样。我在写这个程序的时候正在学习,我想我现在对它的理解好多了。非常感谢你!哦,我忘了说,我必须进行比较(据我所知),因为autosaves绝对必须在顶部。如果2出现在19和20之间,那么您是在数字的形式上排序的<代码>“2”
大于
“19”
,因为每个。你可以使用自然分类,但我怀疑“自动”的东西不会像你想要的那样出现。AutoSaves可以使用orderby来完成,但是一个比较器方法(不需要是IComparable)可以使代码更整洁。我已经让它工作了。我照你说的做了很多重接线。现在比较它们是否自动。如果不是,它将按照上面指出的方式比较SaveNumbers,并返回一个-1、0或1的整数。如果其中一个是自动的,is会说一个首先,再一次,是一个应该的整数。如果两者都是自动的,那么它
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
saveItems = saveItems.OrderBy(Function(q) q.SaveNumber).ToList()