哈希表,键/值对。类似于字典(比数组更强大)。哈希表是经过优化的,访问下标的对象先散列过。如果以任意类型键值访问其中元素会快于其他集合。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);// 取得值
}
|
请发表评论