上一篇博客中我们介绍了HashTable的一些简单用法,其中提到HashTable的Key值是区分大小写的,这样在合作
开发的时候就会出现很多问题,只要一不留神就会出错,下面我们介绍一下如何使HashTable得Key值不区分大小
写。正常情况下:
Dim oHash As New 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" 存在
最常用的方法就是在HashTable的加入/移除时先将Key值全部转换为小写(或大写),而进行判断时也将Key值
同样转换为小写(或大写)。
Dim oHash As New Hashtable()
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自己处理,而我们不用去区分大小写,这就用到Hashtable的一个建构函数,如下:
Public Sub New ( _
equalityComparer As IEqualityComparer _
这样我们只要写一个实现IEqualityComparer的类来做Key值大小比对可以了。
Public Class THashKeyComparer
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
当我们实例化Hashtable时,只需要使用自定义的类来初始化Hashtable就可以了!
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" 存在
注:如果把添加Key/Value值放到了循环里面,每次执行完之后记得调用:oHash.Clear()方法,清楚Hashtable的所有Key/Value。
这次开发的时候,因为只有我用到了Hashtable,所以跟大家交互的时候出现了很多问题,第一种方式转换大小写没有问题,第二种方式用C#没有实现,正在研究中,大家要是有好的方式,欢迎多交流!!!