在Visual Basic中按密钥长度排序SortedDictionary?

时间:2015-10-07 02:59:19

标签: vb.net icomparer sorteddictionary

我正在编写一个脚本,对文件中的参与者数据进行匿名化。

基本上,我有:

  • 明文参与者数据的文件夹(有时是CSV,有时是XML,有时是TXT)
  • 已知用户名和附带匿名ID的文件(例如jsmith1作为已知用户名,User123作为匿名ID)

我想用相应的匿名ID替换已知用户名的每个实例。

一般来说,我的工作正常 - 它将用户名和匿名ID加载到字典中,并逐个对文档文本进行查找和替换。

但是,此脚本也会删除名称,遇到其他名称中包含的名称时会遇到一些困难。所以,例如,我有两对:

约翰,User123 约翰尼,User456

现在,当我运行find-and-replace时,它可能首先遇到John,因此它用User123ny替换Johnny,然后不会触发Johnny。

我能想到的最简单的解决方案就是将查找和替换从最长的密钥运行到最短的密钥。为此,看起来我需要一个SortedDictionary。

但是,我似乎无法说服Visual Basic为此获取我的自定义Comparer。你怎么指定这个?我所拥有的是:

Sub Main()
    Dim nameDict As New SortedDictionary(Of String, String)(AddressOf SortKeyByLength)
End Sub

Public Function SortKeyByLength(key1 As String, key2 As String) As Integer
    If key1.Length > key2.Length Then
        Return 1
    ElseIf key1.Length < key2.Length Then
        Return -1
    Else
        Return 0
    End If
End Function

(以上详细说明以防万一有关于如何解决此问题的更好的想法。)

1 个答案:

答案 0 :(得分:1)

我认为它需要一个实现IComparer接口的类,所以你需要这样的东西:

Public Class ByLengthComparer
    Implements IComparer(Of String)

    Public Function Compare(key1 As String, key2 As String) As Integer Implements IComparer(Of String).Compare
        If key1.Length > key2.Length Then
            Return 1
        ElseIf key1.Length < key2.Length Then
            Return -1
        Else
            '[edit: in response to comments below]
            'Return 0
            Return key1.Compare(key2)
        End If
    End Function
End Class

然后,在您的主要方法中,您可以这样称呼它:

Dim nameDict As New SortedDictionary(Of String, String)(New ByLengthComparer())  

您可能希望在SortedDictionary constructor的文档中查看(或重新查看),以及如何制作class that implements IComparer