C#非泛型集合类-HashTable的用法

哈希表,键/值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。GetHashCode()方法返回一个int型数据,使用这个键的值生成该int型数据。哈希表获取这个值最后返回一个索引,表示带有给定散列的数据项在字典中存储的位置。

注:Hash,一般翻译做“散列”,也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre--mage),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

一、使用hashtable前,需要添加System.Collections的引用。

using System.Collections;

二、添加元素

Hashtable ht =new Hashtable();

ht.Add(key,value);// key,value可以是任何类型

如果key有重复会掷出运行时异常,你可以这样处理。

if(ht.Contains(key)==false)

{

ht.Add(key,value);// 不存在则添加

}

也可以这样处理,效率要高些

Try

{

ht.Add(key,value);

}

Catch

{

// 不处理重复异常

}

看下面的代码:

using System;

using System.Collections; //使用Hashtable时,必须引入这个命名空间

class hashtable

{

public static void Main()

{

Hashtable ht=new Hashtable(); //创建一个Hashtable实例

if(ht.Contains("E")==false)//判断哈希表是否包含特定键,其返回值为true或false 注意:Contains只能查找的是键key而不是值value,且键在哈希表是惟一的

{

ht.Add("E","e");// 不存在则添加key/value键值对

}

ht.Add("E","e");//添加key/value键值对

ht.Add("A","a");

ht.Add("C","c");

ht.Add("B","b");

ht.Add("D","d");

if(ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为true或false

Console.WriteLine("the E key:exist");

}

}

这段代码会发生未处理异常错误。如果我们去掉下面的ht.Add("E","e")这句话,就会返回正确的结果。

我们用遍历哈希表集合输出:

using System;

using System.Collections; //使用Hashtable时,必须引入这个命名空间

class hashtable

{

public static void Main()

{

Hashtable ht = new Hashtable(); //创建一个Hashtable实例

if (ht.Contains("E") == false)

//判断哈希表是否包含特定键,其返回值为true或false

{

ht.Add("E", "e"); // 不存在则添加key/value键值对

}

ht.Add("A", "a");

ht.Add("B", "b");

ht.Add("C", "c");

ht.Add("D", "d");

if (ht.Contains("E"))

//判断哈希表是否包含特定键,其返回值为true或false

Console.WriteLine("the E key:exist");

//输出E键已存在

foreach (DictionaryEntry myde in ht)

{

Console.WriteLine("\t{0}\t{1}", myde.Key, myde.Value); //输出键和值

}

}

}

三、删除元素

ht.Remove(key);

四、删除所有

ht.Clear();

我们继续写下面的代码

using System;

using System.Collections; //使用Hashtable时,必须引入这个命名空间

class hashtable

{

public static void Main()

{

Hashtable ht = new Hashtable(); //创建一个Hashtable实例

ht.Add("E", "e"); //添加key/value键值对

ht.Add("A", "a");

ht.Add("B", "b");

ht.Add("C", "c");

ht.Add("D", "d");

if (ht.Contains("E"))

//判断哈希表是否包含特定键,其返回值为true或false

Console.WriteLine("the E key:exist");

ht.Remove("C"); //移除一个key/value键值对

Console.WriteLine(ht["A"]); //此处输出a

foreach (DictionaryEntry myde in ht)

{

Console.WriteLine("\t{0}\t{1}", myde.Key, myde.Value); //输出键和值

}

ht.Clear(); //移除所有元素

Console.WriteLine(ht["A"]); //此处将不会有任何输出

foreach (DictionaryEntry my in ht)

{

Console.WriteLine("\t{0}\t{1}", my.Key, my.Value); //输出键和值

}

Console.WriteLine("这里不会有输出"); //这里不会有输出

}

}

五、判断键是否已经存在

ht.Contains(key) // 这个刚才已经用过了

六、遍历键

foreach(Object key in ht.Keys)

{

}

七、遍历值

foreach(Object value in ht.Values)

{

}

八、同时遍历键值对

foreach(DictionaryEntry de in ht)

{

Console.WriteLine(de.Key);// 取得键

Console.WriteLine(de.Value);// 取得值

}