CS4L4——Hashtable

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
Hashtable                    //散列表,基于键的哈希代码组织起来的键值对,使用object存储
hashtable.Add() //添加键值对
hashtable.Remove() //根据键移除键值对
hashtable.Clear() //清空
hashtable[] //索引器
hashtable.Contains() //检测是否存在键
hashtable.ContainsKey() //检测是否存在键
hashtable.ContainsValue() //检测是否存在值
hashtable.Count //获取键值对数量
Hashtable.Keys //获取键的集合
hashtable.Values //获取值的集合
hashtable.GetEnumerator() //获取迭代器

Hashtable

Hashtable​(又称散列表)是基于键的哈希代码组织起来的 键/值对
它的主要作用是提高数据查询的效率,使用键来访问集合中的元素

使用 Hashtable​ 需要引用 System.Collections​ 这个命名空间

1
2
3
4
5
6
7
8
9
using System.Collections;

class Program
{
static void Main(string[] args)
{
Hashtable hashtable = new Hashtable();
}
}

增删查改

键与值都是 object​ 类型,可以添加任意 object​ 类型

1
2
3
4
5
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add("123", 2);
hashtable.Add(true, false);
hashtable.Add(false, true);

只能通过键去删除,删除不存在的键,会没有反应

1
2
3
4
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Remove(1);
hashtable.Remove(2);

清空

清空哈希表

1
2
3
4
5
6
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add("123", 2);
hashtable.Add(true, false);
hashtable.Add(false, true);
hashtable.Clear();

使用索引器通过键查看值,找不到返回空 (null​)

1
2
3
4
5
6
7
8
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

Console.WriteLine(hashtable[1]);
Console.WriteLine(hashtable[0]); //找不到,因此返回空
Console.WriteLine(hashtable["123123"]);

输出:

1
2
3
123

12

检测键或值是否存在于hashtable

hashtable.Contains()​ 和 hashtable.ContainsKey()​ 都是检测键是否存在
hashtable.ContainsValue()​ 是检测值是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

if (hashtable.Contains(2))
{
Console.WriteLine("存在键为2的键值对");
}
//上下两语句是相同作用的
if (hashtable.ContainsKey(2))
{
Console.WriteLine("存在键为2的键值对");
}

//根据值检测
if (hashtable.ContainsValue(12))
{
Console.WriteLine("存在值为12的键值对");
}

输出:

1
2
3
存在键为2的键值对
存在键为2的键值对
存在值为12的键值对

只能通过索引器改键对应的值内容,无法修改键

1
2
3
4
5
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
Console.WriteLine(hashtable[1]);
hashtable[1] = 100.5f;
Console.WriteLine(hashtable[1]);

输出:

1
2
123
100.5

遍历

得到键值对对数

1
2
3
4
5
6
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

Console.WriteLine(hashtable.Count);

输出:

1
3

遍历所有键

1
2
3
4
5
6
7
8
9
10
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

foreach (var key in hashtable.Keys)
{
Console.WriteLine("键:" + key);
Console.WriteLine("值:" + hashtable[key]);
}

输出:

1
2
3
4
5
6
键:123123
值:12
键:2
值:1234
键:1
值:123

遍历所有值

hashtable.Values​ 不存在索引器,不能直接用 for​ 循环遍历

1
2
3
4
5
6
7
8
9
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

foreach (var value in hashtable.Values)
{
Console.WriteLine("值:" + value);
}

输出:

1
2
3
值:12
值:1234
值:123

键值对一起遍历

1
2
3
4
5
6
7
8
9
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

foreach (DictionaryEntry item in hashtable)
{
Console.WriteLine("键:" + item.Key + ",值:" + item.Value);
}

输出:

1
2
3
键:123123,值:12
键:2,值:1234
键:1,值:123

迭代器遍历法

获取迭代器(#TODO#​)后,循环迭代,每次获取到一个值后就迭代

1
2
3
4
5
6
7
8
9
10
11
12
Hashtable hashtable = new Hashtable();
hashtable.Add(1, "123");
hashtable.Add(2, "1234");
hashtable.Add("123123", 12);

IDictionaryEnumerator enumerator = hashtable.GetEnumerator();
bool flag = enumerator.MoveNext();
while (flag)
{
Console.WriteLine("键:" + enumerator.Key + ",值:" + enumerator.Value);
flag = enumerator.MoveNext();
}

输出:

1
2
3
键:123123,值:12
键:2,值:1234
键:1,值:123

装箱拆箱

由于用万物之父 object​ 来存储数据,自然存在装箱拆箱,
当往其中进行值类型存储时就是在装箱,将值类型对象取出来转换使用时,就是在拆箱