我有一个名为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
答案 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()
中处理,具体取决于类公开的信息。