首页 > 编程笔记 > C#笔记 阅读:6

C# Hashtable哈希表的用法(附带实例)

C# 的哈希表(Hashtable)是在 System.Colletions 命名空间内的一种集合,主要是可以处理非序列的数据结构,它的元素是用“键/值”的方式配对存储的。在 Python 语言中,这类数据结构称为字典(Dictionary)。

可以使用 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

相关文章