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