对象比较器-还是应该首先使用SortedSet?

时间:2018-12-04 19:07:39

标签: vb.net collections

我想创建一个对象的排序列表,这些对象类似于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

1 个答案:

答案 0 :(得分:0)

我认为这会起作用(不过尚未进行测试):

为Item类提供一个共享的私有字段SerialNumber和一个SNo字段。调用New时,将SerialNumber复制到SNo中并递增。将此用作排序的辅助键。