Icomparer для объектов - или я должен использовать SortedSet в первую очередь? - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу создать отсортированный список объектов, которые скорее похожи на пары 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

1 Ответ

0 голосов
/ 05 декабря 2018

Я думаю, что это будет работать (пока не проверено):

Дайте классу Item общее приватное поле SerialNumber и поле SNo.Когда вызывается New, скопируйте SerialNumber в SNo и увеличьте его.Используйте это как вторичный ключ для сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...