7.7 Hashtable(哈希表)

视频讲解:光盘\TM\lx\7\07 Hashtable(哈希表).mp4

Hashtable(哈希表)是一种重要的集合类型,本节将对Hashtable的概念及使用方法进行详细介绍。

7.7.1 Hashtable概述

Hashtable通常称为哈希表,它表示键/值对的集合,这些键/值对根据键的哈希代码进行组织。它的每个元素都是一个存储在DictionaryEntry对象中的键/值对。键不能为空引用,但值可以。

Hashtable的构造函数有多种,这里介绍两种最常用的。

(1)使用默认的初始容量、加载因子、哈希代码提供程序和比较器来初始化Hashtable类的新的空实例,语法如下。

        public Hashtable()

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

        public Hashtable(int capacity)

capacity:Hashtable对象最初可包含的元素的近似数目。

Hashtable常用属性及说明如表7.2所示。

表7.2 Hashtable常用属性及说明

7.7.2 Hashtable元素的添加

向Hashtable中添加元素时,可以使用Hashtable类提供的Add方法。下面对该方法进行详细介绍。

Add方法用来将带有指定键和值的元素添加到Hashtable中,其语法格式如下。

        public virtual void Add(Object key, Object value)

key:要添加的元素的键。

value:要添加的元素的值,该值可以为空引用。

说明 如果指定了Hashtable的初始容量,则不用限定向Hashtable对象中添加因子的个数。容量会根据加载的因子自动增加。

【例7.35】创建一个控制台应用程序,其中实例化一个Hashtable对象,然后使用Add方法为该Hashtable对象添加3个元素,代码如下。(实例位置:光盘\TM\sl\7\15)

        Hashtable hashtable=new Hashtable();              //实例化Hashtable对象
        hashtable.Add("id", "BH0001");                    //向Hashtable中添加元素
        hashtable.Add("name", "TM");
        hashtable.Add("sex", "男");
        Console.WriteLine(hashtable.Count);               //获得Hashtable中的元素个数

程序的运行结果为3。

7.7.3 Hashtable元素的删除

在Hashtable中删除元素时,可以使用Hashtable类提供的Clear方法和Remove方法。下面对这两个方法进行详细介绍。

1.Clear方法

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

        public virtual void Clear()

【例7.36】创建一个控制台应用程序,其中实例化一个Hashtable对象,同时使用Add方法为该Hashtable对象添加3个元素,然后使用Clear方法移除Hashtable中的所有元素,代码如下。(实例位置:光盘\TM\sl\7\16)

        Hashtable hashtable=new Hashtable();              //实例化Hashtable对象
        hashtable.Add("id", "BH0001");                    //向Hashtable中添加元素
        hashtable.Add("name", "TM");
        hashtable.Add("sex", "男");
        hashtable.CIear();                                //移除Hashtable中的元素
        Console.WriteLine(hashtable.Count);

程序的运行结果为0。

2.Remove方法

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

        public virtual void Remove(Object key)

key:要移除的元素的键。

【例7.37】创建一个控制台应用程序,其中实例化一个Hashtable对象,同时使用Add方法为该Hashtable对象添加3个元素,然后使用Remove方法移除Hashtable中键为sex的元素,代码如下。(实例位置:光盘\TM\sl\7\17)

        Hashtable hashtable=new Hashtable();              //实例化Hashtable对象
        hashtable.Add("id", "BH0001");                    //向Hashtable中添加元素
        hashtable.Add("name", "TM");
        hashtable.Add("sex", "男");
        hashtable.Remove("sex");                          //移除Hashtable中的指定元素
        Console.WriteLine(hashtable.Count);

程序的运行结果为2。

7.7.4 Hashtable的遍历

Hashtable的遍历与数组类似,都可以使用foreach语句。这里需要注意的是,由于Hashtable中的元素是一个键/值对,因此需要使用DictionaryEntry结构来进行遍历。DictionaryEntry结构表示一个键/值对的集合。下面通过一个实例说明如何遍历Hashtable中的元素。

【例7.38】创建一个控制台应用程序,其中实例化了一个Hashtable对象,并使用Add方法向Hashtable中添加了3个元素,然后使用foreach语句遍历Hashtable中的各个键/值对并输出。程序代码如下。(实例位置:光盘\TM\sl\7\18)

        static void Main(string[] args)
        {
            Hashtable hashtable=new Hashtable();          //实例化Hashtable对象
            hashtable.Add("id", "BH0001");                //向Hashtable中添加元素
            hashtable.Add("name", "TM");
            hashtable.Add("sex", "男");
            Console.WriteLine("\t键\t值");
            foreach (DictionaryEntrydicEntry inhashtable) //遍历Hashtable中的元素并输出其键/值对
            {
              Console.WriteLine("\t "+dicEntry.Key+"\t "+dicEntry.VaIue);
            }
            Console.WriteLine();
        }

按Ctrl+F5键查看运行结果,如图7.20所示。

图7.20 Hashtable的遍历实例运行结果

7.7.5 Hashtable元素的查找

在Hashtable中查找元素时,可以使用Hashtable类提供的Contains方法、ContainsKey方法和ContainsValue方法。下面主要对这3个方法进行详细介绍。

1.Contains方法

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

        public virtual bool Contains(Object key)

key:要在Hashtable中定位的键。

返回值:如果Hashtable包含具有指定键的元素,则为true;否则为false。

【例7.39】创建一个控制台应用程序,其中实例化一个Hashtable对象,同时使用Add方法为该Hashtable对象添加3个元素,然后使用Contains方法判断键id是否在Hashtable中,代码如下。(实例位置:光盘\TM\sl\7\19)

        Hashtable hashtable=new Hashtable();              //实例化Hashtable对象
        hashtable.Add("id", "BH0001");                    //向Hashtable中添加元素
        hashtable.Add("name", "TM");
        hashtable.Add("sex", "男");
        Console.WriteLine(hashtable.Contains("id"));      //判断Hashtable中是否包含指定的键

程序的运行结果为true。

说明 ContainsKey方法和Contains方法实现的功能、语法都相同,这里不再详细说明。

2.ContainsValue方法

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

        public virtual bool ContainsValue(Object value)

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

返回值:如果Hashtable包含带有指定的value的元素,则为true;否则为false。

【例7.40】创建一个控制台应用程序,其中实例化一个Hashtable对象,同时使用Add方法为该Hashtable对象添加3个元素,然后使用ContainsValue方法判断值id是否在Hashtable中,代码如下。(实例位置:光盘\TM\sl\7\20)

        Hashtable hashtable=new Hashtable();               //实例化Hashtable对象
        hashtable.Add("id", "BH0001");                     //向Hashtable中添加元素
        hashtable.Add("name", "TM");
        hashtable.Add("sex", "男");
        Console.WriteLine(hashtable.ContainsVaIue("id"));  //判断Hashtable中是否包含指定的键值

程序的运行结果为false。

互动练习:尝试使用哈希表记录网络电台程序中的电台名称及电台网址,具体要求为:在“电台地址”下拉列表中选择或输入电台地址,如果该电台地址已经存在于本程序的数据文件中,则会在“电台名称”下拉列表中自动显示其对应的电台名称;否则,用户可以在“电台名称”下拉列表中手动输入电台名称。