我想创建一个对象的排序列表,这些对象类似于KeyValue对,其中Value本身就是一个Object(相当复杂,并且可能是许多基本类型的子类之一)。键可以重复,我不介意值的排序顺序-甚至不必是确定性的。
由于重复的键,SortedList将不起作用,所以我想到了SortedSet。但是要使其正常工作,似乎我需要一个比较器,当条目不同时,该比较器返回一个非零值,因此我需要将Value包含在比较中。
在程序中经常需要遍历列表,因此我在其他地方看到过要使用List并在需要时对其进行排序的建议可能不会很好地起作用。
所以我的问题是:我该如何编写一个比较对象的Icomparer,并且当对象实际上相同时才产生0结果?
随后出现了一些相当少的VB.NET代码。
MustInherit Class Item
Friend Name As String
' I'm not bothering to add the constructor - just assume that "name" gets set somehow
End Class
Public Class ItemA
Inherits Item
End Class
Public Class ItemB
Inherits Item
End Class
Class ListEntry
Friend Key As Integer
Friend Entry As Item
End Class
Class EntryComparer
Implements IComparer(Of ListEntry)
Public Function Compare(x As ListEntry, y As ListEntry) As Integer Implements IComparer(Of ListEntry).Compare
If x.Key > y.Key Then
Return 1
ElseIf x.Key < y.Key Then
Return -1
Else
If x.Entry is y.Entry Then
Return 0
End If
'****************************
' what do I put in here to compare the Entry fields to ensure that it's only 0 when they're the same object?
'****************************
End If
End Function
End Class
答案 0 :(得分:0)
我认为这会起作用(不过尚未进行测试):
为Item类提供一个共享的私有字段SerialNumber和一个SNo字段。调用New时,将SerialNumber复制到SNo中并递增。将此用作排序的辅助键。