讓 Hashtable 的鍵值不區分大小寫
我們常用 Hashtable 來描述索引鍵/值組的集合,Hashtable 的鍵值是區分大小寫的。
Dim bIsFind As Boolean
oHash.Add("A", "ValueA")
oHash.Add("B", "ValueA")
oHash.Add("C", "ValueA")
bIsFind = oHash.Contains("a") '鍵值 "a" 不存在
bIsFind = oHash.Contains("A") '鍵值 "A" 存在
若我們需要讓 Hasktable 不區分大小寫怎麼處理呢?常看到的一種作法就是在 Hasktable 的加入/移除時先將鍵值全轉為小寫(或大寫),而判斷時也將鍵值同樣轉為小寫(或大寫)。
Dim bIsFind As Boolean
oHash.Add("A".ToLower, "ValueA")
oHash.Add("B".ToLower, "ValueA")
oHash.Add("C".ToLower, "ValueA")
bIsFind = oHash.Contains("a".ToLower) '鍵值 "a" 存在
bIsFind = oHash.Contains("A".ToLower) '鍵值 "A" 存在
當然上述的方式是可行為,不過略顯麻煩,若鍵值忘了轉換就加入就容易導致找不到的情形,最好的方式就是由 Hashtable 本身自行處理,讓開發人員無需去理會鍵值大小寫。
在 Hasktable 的有一多載的建構函式如下
equalityComparer As IEqualityComparer _
)
所以我們只要撰寫一個具 IEqualityComparer 介面的類別來做鍵值比對就可以了。
Implements IEqualityComparer
Public Function Equals1(ByVal x As Object, ByVal y As Object) _
As Boolean Implements IEqualityComparer.Equals
Return (CStr(x).ToLower = CStr(y).ToLower)
End Function
Public Function GetHashCode1(ByVal obj As Object) _
As Integer Implements IEqualityComparer.GetHashCode
Return obj.ToString().ToLower().GetHashCode()
End Function
End Class
當我們要使用 Hasktable 時,只要使用自定義具 IEqualityComparer 的類別來初始化 Hasktable 即可。
Dim oHash As New Hashtable(New THashKeyComparer())
Dim bIsFind As Boolean
oHash.Add("A", "ValueA")
oHash.Add("B", "ValueA")
oHash.Add("C", "ValueA")
bIsFind = oHash.Contains("a") '鍵值 "a" 存在
bIsFind = oHash.Contains("A") '鍵值 "A" 存在