ジェネリックのおかげでHashTableが Dictionary(of T1,T2) になり便利なことこの上ないです。
ただ,キーとなるT1がStringのとき,大文字小文字を不問で使いたいなぁと思ってました。
New Dictionary(..) のコンストラクタをみていくとなにやら 怪しげな構文がある.
Private useControls As New Dictionary(Of String, DEF)(New xxxxx)
なんじゃらほい? ...と追求していくと,わが総帥中氏のhttp://naka.wankuma.com/site/kaisetu/dotnet/2.0_generics/generics6.htm に辿り着きました。
さすが中先生。一年前に既に投稿されてました。
object比較を実装したクラスを コンストラクタとして実装したものを設定すれば,判定をユーザー側に委任される。
というわけで大文字小文字不問のハッシュテーブルができました。なんなとできるものですね。
一つ疑問があり, クラスを指定するのでなく, addressof で delegate指定にすると不味い点あるのでしょうかね?
参考ソース:
Private useControls As New Dictionary(Of String, user型)(New StrIgnoreCaseCompare)
Public Class StrIgnoreCaseCompare
Implements IEqualityComparer(Of String)
Public Function Equals1(ByVal x As String, ByVal y As String) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of String).Equals
If x.ToUpper = y.ToUpper Then
Equals1 = True
Else
Equals1 = False
End If
End Function
Public Function GetHashCode1(ByVal obj As String) As Integer Implements System.Collections.Generic.IEqualityComparer(Of String).GetHashCode
Dim HashData As String = String.Format("{0}", obj.ToUpper)
GetHashCode1 = HashData.GetHashCode()
End Function
End Class