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

时间:2021-04-21 17:01:07

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

}