4.5 Hashtable

Hashtable通常被称为哈希表,Hashtable与ArrayList一样也属于System.Collections命名空间,Hashtable中的每个元素都是一个存储在DictionaryEntry对象中的key/value对,其中key通常用来快速查找,同时key也可区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。

Hashtable的构造方法有很多种,在此只介绍几种最常用的构造方法。

(1)使用默认的、不带参数的构造方法初始化Hashtable类的实例,这样使得初始容量、加载因子、哈希代码提供程序和比较器都是默认的,其语法如下:

    public Hashtable()

(2)使用指定的初始容量、默认加载因子、默认哈希代码提供程序和摩恩比较器来初始化Hashtable类的实例,其语法如下:

    public Hashtable(int capacity)

其中,capacity是Hashtable对象最初可包含的元素的近似数。

4.5.1 Hashtable的属性及其方法

Hashtable的属性及其方法如表4-2所示。

表4-2 Hashtable的属性及其方法

下面就Hashtable的操作,重点讲解下其相应方法的使用。

4.5.2 Hashtable元素的添加

向Hashtable中添加元素可以使用Hashtable类的Add方法,Add方法将带有指定键和值的元素添加到Hashtable中,其语法格式如下:

    public virtual void Add (
        Object key,
        Object value
    )

其中,key为要添加的元素的键,value为要添加的元素的值。

此处要注意的是,key不可以为null,value可以。

4.5.3 Hashtable元素的删除

Hashtable删除元素时可以使用Remove方法和Clear方法。下面分别对这两个方法进行讲解。

1.Remove方法

Remove方法用于从Hashtable中移除带有指定键的元素,其语法格式如下:

    public virtual void Remove (
        Object key
    )

2.Clear方法

Clear方法用于从Hashtable中移除所有元素,其语法格式如下:

    public virtual void Clear ()

4.5.4 Hashtable元素的遍历

遍历Hashtable的方法与遍历数组以及ArrayList类似,都可使用foreach等语句。

之前介绍过,由于Hashtable中的每个元素都是一个DictionaryEntry类的对象,因此应使用DictionaryEntry类型来进行遍历。

4.5.5 Hashtable元素的查找

在Hashtable中查找元素,可使用Hashtable类提供的Contains方法、ContainsKey方法以及ContainsValue方法。下面分别对这三种方法进行讲解。

1.Contains方法

Contains方法用于确定Hashtable是否包含特定键,其语法格式如下:

    public virtual bool Contains (
        Object key
    )

其中,key为要在Hashtable中定位的键。

2.ContainsKey方法

ContainsKey方法用于确定Hashtable是否包含特定键,其语法格式如下:

    public virtual void ContainsKey (
        Object key
    )

其中,key为要在Hashtable中定位的键。

3.ContainsValue方法

ContainsValue方法用于确定Hashtable是否包含特定值,其语法格式如下:

    public virtual void ContainsValue (
        Object value
    )

其中,value为要在Hashtable中定位的值。该值可以为空引用。

下面的例子演示了对Hashtable的相关操作。

例4-7:Hashtable的相关操作(ConsoleHashtable)

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleHashtable
    {
        class Program
        {
            static void Main(string[] args)
            {
                Hashtable ht = new Hashtable();
    
                ht.Add("sichuan", "chengdu");
                ht.Add("jiangsu", "nanjing");
                ht.Add("anhui", "hefei");
                ht.Add("hunan", "changsha");
                ht.Add("shandong", "jinan");
    
                Console.WriteLine("Hashtable初始元素为:");
    
                foreach (DictionaryEntry de in ht)
                {
                    Console.WriteLine("Key:{0}\t\tValue:{1}", de.Key, de. 
                    Value);
                }
    
                if (ht.ContainsKey("anhui"))
                {
                    ht.Remove("anhui");
                }
                Console.WriteLine("\nHashtable移除元素后的结果为:");
    
                foreach (string str in ht.Keys)
                {
                    Console.WriteLine("Key:{0}\t\tValue:{1}", str, ht[str]);
                }
                ht.Clear();
                Console.WriteLine("\n已移除Hashtable中的所有元素!");
                Console.ReadLine();
            }
        }
    } 

运行结果如图4-7所示。

图4-7 Hashtable的相关操作