C# 中 Hashtable 和 Dictionary 的区别

17 Mar 2025 | 6 分钟阅读

在本文中,我们将讨论 C# 中 **Hashtable** 和 **Dictionary** 之间的区别。但在讨论它们的区别之前,我们必须先了解 C# 中的 Hashtable 和 Dictionary,并附带示例。

Hashtable 简介

C# 中一个名为 **Hashtable** 的集合类,用于保存 **键/值** 对。它包含在集合的 **System.namespace** 中。

工作原理概述

  1. 键/值对:哈希表中的每个条目都由一个单独的键及其匹配的信息组成。哈希表中的值可以重复,但标识符需要是唯一的。
  2. 哈希:哈希表使用哈希技术在内部将键映射到其关联的值。因此,可以通过标识号高效地检索值。
  3. 快速查找:由于哈希,哈希表可以根据键快速查找值。从哈希表中获取元素的平均时间通常保持不变。
  4. 动态大小:哈希表会不断调整大小以腾出更多空间。这有助于在 Hashtable 的元素计数波动时保持高效的性能。
  5. 不保证顺序:与 C# 中的列表和字典等其他集合类型不同,哈希表中所有组件的顺序不保证。元素在哈希表中存储的顺序不是固定的。

示例

让我们举一个例子来说明如何在 C# 中使用 **hashtable**。

输出

Value of 'apple': 10
Value of 'banana': 20
Key: apple, Value: 10
Key: orange, Value: 40

说明

在此示例中,给定的 C# 代码展示了如何使用集合的 System.Collections 命名空间。在 Main 函数中创建了一个名为 **"hashtable"** 的新 Hashtable 实例。之后,使用 Add 操作向此 hashtable 添加键/值对。由于几乎每个键都有一个匹配的值,因此可以通过仅匹配的键高效地检索值。

代码展示了添加键值对后如何使用相应的键从 hashtable 中访问值。方括号和键名用于立即检索值。

之后,代码通过提供新值来更改与 **"orange"** 键关联的值。此外,通过使用 delete 方法删除键/值组合,从 hashtable 中删除了 **"banana"** 的条目。

最后,代码使用 **foreach** 循环遍历 hashtable 中剩余的键/值对。每个 **DictionaryEntry** 对象代表 hashtable 中的一个条目,包含键和值。通过打印每个项目的键和值,在控制台上显示调整后的 hashtable 的内容。

C# 中的 Dictionary 简介

Dictionary 是 C# 中的一个泛型集合类,它通过存储键/值对来促进快速查找、插入和删除决策。它包含在 System.Collections 命名空间中。以下是其主要特征的摘要。

  1. 键/值对:与哈希表一样,字典中的每个元素都有一个唯一的键和一个对应的值。变量可以重复,但字典中的键必须是唯一的。
  2. 强类型:与 Hashtable 不同,字典是强类型的,它存储对象并需要装箱和拆箱。这意味着它提供了类型正确性,并且由于我们在声明 Dictionary 实例时为每个键和值指定了类型,因此无法执行装箱/拆箱操作。
  3. 类型安全和性能:由于其强类型,Dictionary 的性能优于 Hashtable,尤其是在处理不同类型的值和消除不必要的类型转换时。
  4. 快速查找:Dictionary 像 Hashtable 一样在内部使用哈希,这提供了根据键快速查找值的速度。从字典中检索元素的平均时间复杂度通常是常数。
  5. 不保证顺序:与 Hashtable 一样,Dictionary 也不对其组件的排列提供任何保证。
  6. Dictionary 对语言集成查询 (LINQ) 的支持:LINQ 使我们能够通过进行投影、查询和转换来处理存储在 Dictionary 中的键/值对。

示例

让我们举一个例子来说明如何在 C# 中使用 **dictionary**。

输出

Value of 'apple': 10
Value of 'banana': 20
Key: apple, Value: 10
Key: orange, Value: 40

说明

附带的 C# 代码演示了字典,它是一种用于存储键/值对的集合类型。代码中声明了一个名为 dictionary 的新 **Dictionary** 对象,其中包含整数值和字符串键。之后,将表示水果数量的键值对添加到此字典中。代码展示了如何更改与键关联的值,以及如何使用相应的键访问值。它还展示了如何从字典中删除键/值组合。最后,源代码在遍历单词列表时将每个键/值组合打印到控制台。此示例演示了字典内添加、读取、修改和删除项的基本 C# 操作。

C# 中 Hashtable 和 Dictionary 的主要区别

Difference between Hashtable and Dictionary in C#

C# 中 **Hashtable** 和 **Dictionary** 之间存在几个主要区别。hashtable 和 dictionary 之间的一些主要区别如下:

特点Hashtable字典
命名空间System 包含集合的 hashtable 命名空间。系统中有字典。命名空间 Collections。
类型安全hashtable 缺乏类型安全性。它被设计为被装箱/拆箱和存储项。
dictionary 具有类型安全性。它充当泛型集合类,允许我们设置值和键的类型。技术提高了性能,消除了装箱和拆箱的成本,尤其是在处理廉价类型时。
成就特别是对于值类型,由于装箱/拆箱和缺乏类型安全性,Hashtable 的性能可能略低于 Dictionary。Dictionary 的类型安全性以及避免装箱和拆箱过程,提高了效率,尤其是在处理值类型时。
良好的类型检查hashtable 无法为值和键提供编译时类型验证。dictionary 通过提供编译时类型检查来确保生成时的类型安全,以输入键和值。
兼容性任何类型的信息都可以作为键和值在 hashtable 中表示。在声明字符列表时,需要显式指定键和值类型。
枚举当使用 for each 运算符循环遍历 hashtable 时,可能会发生装箱和拆箱技术。dictionary 的安全功能比枚举其项更有效。