Я хочу создать отсортированный список объектов, которые скорее похожи на пары KeyValue, где само значение является объектом (довольно сложным и может быть одним из нескольких подклассов базового типа).Ключи могут быть продублированы, и я не против, в каком порядке отсортированы значения - это даже не должно быть детерминированным.
SortedList не будет работать из-за дублированных ключей, поэтому я подумалSortedSet.Но чтобы заставить это работать, мне кажется, что мне нужен компаратор, который возвращает ненулевое значение, когда записи различны, поэтому мне нужно включить значение как часть сравнения.
Необходимость обходаСписок в отсортированном порядке встречается в программе довольно часто, поэтому предложение, которое я видел в других местах, чтобы использовать Список и сортировать его при необходимости, вероятно, не будет работать слишком хорошо.
Поэтому мой вопрос: какя могу написать 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