質問:ここで見つけた双方向辞書クラスを使用しています: C#の双方向1対1辞書
問題は、これが必要なことです-大文字と小文字を区別しません(StringComparer.OrdinalIgnoreCase)
IEqualityComparerコンストラクターをカバーするように拡張したいと思います。VB(チャームのように機能します)に変換しましたが、比較ツールの「転送」を実装するのに問題があります。
問題は、私が持っているパラメータにあります:
ByVal x As System.Collections.Generic.IEqualityComparer(Of TKey)
しかし、ディクショナリのsecondToFirstはTValue、TKeyタイプであり、IEqualityComparerを強制終了します。IEqualityComparerはTKeyではなくTValueタイプである必要があります。
この比較器を型キャストするにはどうすればよいですか?
大文字と小文字を区別しないBiDictionaryOneToOneの別のクラスがどこかにある場合は、それも問題ありません(そのライブラリがサイズ/メモリ消費量と.NET 2.0で記念碑的でない限り)
Public Class BiDictionaryOneToOne(Of TKey, TValue)
Public Sub New(ByVal x As System.Collections.Generic.IEqualityComparer(Of TKey))
Dim y As System.Collections.Generic.IEqualityComparer(Of TValue) = StringComparer.OrdinalIgnoreCase
firstToSecond = New Dictionary(Of TKey, TValue)(x)
secondToFirst = New Dictionary(Of TValue, TKey)(y)
End Sub
編集:
もちろん、ジョンが指摘するように、TKeyとTValueが文字列型である場合にのみ可能ですが、同じ場合は、次のようにtry/catchを使用しても可能です。
Public Sub New(ByVal cmpFirstDirection As System.Collections.Generic.IEqualityComparer(Of TKey))
Try
Dim cmpOppositeDirection As System.Collections.Generic.IEqualityComparer(Of TValue) = CType(cmpFirstDirection, System.Collections.Generic.IEqualityComparer(Of TValue))
firstToSecond = New Dictionary(Of TKey, TValue)(cmpFirstDirection)
secondToFirst = New Dictionary(Of TValue, TKey)(cmpOppositeDirection)
Catch ex As Exception
firstToSecond = New Dictionary(Of TKey, TValue)(cmpFirstDirection)
secondToFirst = New Dictionary(Of TValue, TKey)
End Try
End Sub
Public Sub New(ByVal cmpFirstDirection As System.Collections.Generic.IEqualityComparer(Of TKey), ByVal cmpOppositeDirection As System.Collections.Generic.IEqualityComparer(Of TValue))
firstToSecond = New Dictionary(Of TKey, TValue)(cmpFirstDirection)
secondToFirst = New Dictionary(Of TValue, TKey)(cmpOppositeDirection)
End Sub