C# Hashtable哈希表的用法(附带实例)
C# 的哈希表(Hashtable)是在 System.Colletions 命名空间内的一种集合,主要是可以处理非序列的数据结构,它的元素是用“键/值”的方式配对存储的。在 Python 语言中,这类数据结构称为字典(Dictionary)。
可以使用 new 关键词创建哈希表对象,例如,要创建 ht 对象,语法如下:
【实例】创建春夏秋冬四季的哈希表,同时设定配对内容。
创建哈希表时也可以将整数当作键(key),可以参考下列实例:
哈希表的常用方法如下:
遍历值可以使用 Values 属性,其语法如下:
ContainsValue() 会回传此哈希表对象是否包含括号中的值,如果包含则回传 true,如果不包含则回传 false,其语法如下:
【实例】成绩查询,请输入学生姓名,如果系统有这个学生则输出学生成绩,如果系统没有这个学生则输出查无此学生资料。
例如,使用 Clear() 清除哈希表元素:
再例如,输入要删除的键,如果存在就删除,如果不存在则告知此键不存在。
可以使用 new 关键词创建哈希表对象,例如,要创建 ht 对象,语法如下:
Hashtable ht = new Hashtable();上述只是创建了哈希表对象ht,暂时没有元素,将来可以增加元素。
C#哈希表增加元素
Add() 方法可以在哈希表对象中增加键-值配对元素内容,其语法如下:ht.Add(Object key, Object value);上述 ht 对象创建完成后,可以使用 ht[key] 设定或获取键值。
【实例】创建春夏秋冬四季的哈希表,同时设定配对内容。
using System.Collections; Hashtable ht = new Hashtable(); ht.Add("Spring", "春季"); ht.Add("Summer", "夏季"); ht.Add("Autumn", "秋季"); ht.Add("Winter", "冬季"); Console.WriteLine($"哈希表长度:{ht.Count}"); Console.WriteLine("设置前"); Console.WriteLine($"{ht["Spring"]}"); // 输出键 "Spring" 的值 ht["Spring"] = "春天"; Console.WriteLine("修改后"); Console.WriteLine($"{ht["Spring"]}");执行结果为:
哈希表长度:4
设置前
ht["Spring"] = 春季
修改后
ht["Spring"] = 春天
创建哈希表时也可以将整数当作键(key),可以参考下列实例:
using System.Collections; Hashtable ht = new Hashtable(); ht.Add(1, "Orange"); ht.Add(2, "Apple"); Console.WriteLine($"{ht[1]} = {ht[1]}"); Console.WriteLine($"{ht[2]} = {ht[2]}");执行结果为:
ht[1] = Orange
ht[2] = Apple
C#遍历哈希表
遍历哈希表需要使用 DictionaryEntry Object 结构,基本语法如下:foreach (DictionaryEntry de in ht) { Console.WriteLine(de.Key); // 输出 hb 对象的键 Console.WriteLine(de.Value); // 输出 hb 对象的值 }例如,创建水果的哈希表,键是水果英文名称,值是水果一斤的价格,然后输出:
using System.Collections; Hashtable ht = new Hashtable(); ht.Add("Apple", 50); ht.Add("Orange", 30); ht.Add("Grapes", 80); Console.WriteLine("输出水果价目表"); foreach (DictionaryEntry de in ht) Console.WriteLine($"{de.Key} : {de.Value}");执行结果为:
输出水果价目表
Orange : 30
Apple : 50
Grapes : 80
C# Hashtable的常用属性和方法
哈希表的常用属性如下:属性 | 说明 |
---|---|
Count | 获得哈希表对象键-值配对的个数。 |
IsFixedSize | 如果是true则表示有固定大小,否则没有固定大小。 |
IsReadOnly | 如果是true则表示是只读,否则不是只读。 |
Item[Object] | 由键获得指定的值。 |
Keys | 获得含有已经定义对象中的所有索引键。 |
Values | 获得含有已经定义对象中的所有值。 |
哈希表的常用方法如下:
方法 | 说明 |
---|---|
Add() | 将索引键-值配对元素加入哈希表对象。 |
Contains()/ContainsKey() | 判断回传键是否存在。 |
ContainsValues() | 判断回传值是否存在。 |
Clear() | 清除哈希表所有元素。 |
Remove() | 删除指定键的元素。 |
ToString() | 将目前对象转成字符串。 |
1) Hashtable遍历键值
遍历键可以使用 Keys 属性,其语法如下:foreach (Object key in ht.Keys) Console.WriteLine(key);
遍历值可以使用 Values 属性,其语法如下:
foreach (Object value in ht.Values) Console.WriteLine(value);例如:
using System.Collections; Hashtable ht = new Hashtable(); ht.Add("Spring", "春季"); ht.Add("Summer", "夏季"); ht.Add("Autumn", "秋季"); ht.Add("Winter", "冬季"); foreach (Object key in ht.Keys) Console.WriteLine($"Keys : {key}"); // 输出键 foreach (Object value in ht.Values) Console.WriteLine($"Values : {value}"); // 输出值执行结果为:
Keys : Summer
Keys : Winter
Keys : Spring
Keys : Autumn
Values : 夏季
Values : 冬季
Values : 春季
Values : 秋季
2) 查询键值
Contains() 和 ContainsKey() 用法相同,都回传此哈希表对象是否包含此键,如果包含则回传 true,如果不包含则回传 false,其语法如下:bool rtn = ht.Contains(key) // ContainsKey()用法一样
ContainsValue() 会回传此哈希表对象是否包含括号中的值,如果包含则回传 true,如果不包含则回传 false,其语法如下:
bool rtn = ht.ContainsValue(value)
【实例】成绩查询,请输入学生姓名,如果系统有这个学生则输出学生成绩,如果系统没有这个学生则输出查无此学生资料。
using System.Collections; Hashtable ht = new Hashtable(); ht.Add("洪锦魁", 92); ht.Add("洪冰儒", 88); Console.Write("请输入姓名:"); Object name = Console.ReadLine(); if (ht.Contains(name)) Console.WriteLine($"{name} 成绩是:{ht[name]}"); else Console.WriteLine("查无此学生资料");执行结果为:
请输入姓名:洪锦魁
洪锦魁 成绩是:92
Microsoft Visual Studio 调试控制台
请输入姓名:JK Hung
查无此学生资料
3) 清除哈希表的元素
清除哈希表元素的方法有两个,分别如下:ht.clear(); // 清除所有元素 ht.Remove(key); // item是要删除的元素
例如,使用 Clear() 清除哈希表元素:
using System.Collections; Hashtable ht = new Hashtable(); ht.Add(1, "One"); ht.Add(2, "Two"); Console.WriteLine("删除前"); Console.WriteLine($"HashTable 长度:{ht.Count}"); ht.Clear(); Console.WriteLine("删除后"); Console.WriteLine($"HashTable 长度:{ht.Count}");执行结果为:
删除前
HashTable 长度:2
删除后
HashTable 长度:0
再例如,输入要删除的键,如果存在就删除,如果不存在则告知此键不存在。
using System.Collections; Hashtable ht = new Hashtable(); ht.Add("One", 1); ht.Add("Two", 2); ht.Add("Three", 3); Console.WriteLine("最初哈希表"); foreach (DictionaryEntry de in ht) // 输出删除前的哈希希表 Console.WriteLine($"{de.Key} : {de.Value}"); Console.Write("请输入要删除的数据:"); Object key = Console.ReadLine(); // 读取要删除的key if (ht.Contains(key)) ht.Remove(key); else Console.WriteLine("输入键值不存在"); Console.WriteLine("最后哈希表"); foreach (DictionaryEntry de in ht) // 输出删除后的哈希希表 Console.WriteLine($"{de.Key} : {de.Value}");执行结果为:
最初哈希表
One : 1
Two : 2
Three : 3
请输入要删除的数据:One
最后哈希表
Two : 2
Three : 3