讓 Hashtable 的鍵值不區分大小寫

讓 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" 存在

ASP.NET 魔法學院