我正在编写一个脚本,对文件中的参与者数据进行匿名化。
基本上,我有:
我想用相应的匿名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
(以上详细说明以防万一有关于如何解决此问题的更好的想法。)
答案 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。