0

質問:ここで見つけた双方向辞書クラスを使用しています: 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
4

1 に答える 1

1

タイプの任意のキー/値ペアの組み合わせを持つことができる一般的なバイディクショナリを作成しようとしています。を使用して2つの整数を比較するとはどういう意味ですか?コンストラクターを変更して、2つのs(1つはfor、もう1つはfor)を取ることをお勧めします。次に、2つの適切な値を渡すことにより、大文字と小文字を区別しないを作成できます。StringComparer IEqualityComparerTKeyTValueBiDictionaryOneToOne(Of String, String)IEqualityComparer(Of String)

于 2011-02-25T10:30:09.237 に答える