哈希表(Hashtable)和键值对(KeyValuePair<TKey, TValue>)不是同一层面的概念,一个是“容器”,一个是“容器里的一个条目”。
哈希表(Hashtable 或 Dictionary<TKey, TValue>) = 整个图书馆。它是一个容器,里面存放着许多本书(键值对)。
键值对(KeyValuePair<TKey, TValue>) = 一本书。它是图书馆里的一个具体条目,包含“书名(Key)”和“内容(Value)”。
关系:图书馆(哈希表)由许多本书(键值对)组成。你不能说“图书馆和书有什么区别”,因为它们是整体和部分的关系。
KeyValuePair<TKey, TValue>)KeyValuePair。csharp
// 一个键值对实例
var kvp = new KeyValuePair<string, int>("苹果", 5);
Console.WriteLine($"键:{kvp.Key},值:{kvp.Value}");
Hashtable 或 Dictionary<TKey, TValue>)定义:一个容器类,内部使用哈希算法存储多个键值对,实现快速查找(O(1))。
用途:存储大量键值对,通过 Key 快速找到 Value。
两种实现:
Hashtable(老派,非泛型):键和值都是 object,有装箱开销,线程安全。Dictionary<TKey, TValue>(现代,泛型):类型安全,无装箱,性能更好。csharp
// 创建一个哈希表(字典)
var dict = new Dictionary<string, int>();
dict["苹果"] = 5; // 添加键值对
dict["香蕉"] = 3;
// 遍历时,每个元素是 KeyValuePair
foreach (KeyValuePair<string, int> kvp in dict)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value}");
}
| 维度 | 键值对(KeyValuePair) | 哈希表(Dictionary / Hashtable) |
|---|---|---|
| 本质 | 单个条目(一本书) | 容器(整个图书馆) |
| 包含关系 | 被哈希表包含 | 包含多个键值对 |
| 可遍历性 | 无(就是一个数据对) | 可遍历所有键值对 |
| 查找能力 | 无(不提供查找) | 通过 Key 快速查找 Value(O(1)) |
| 可变性 | 创建后不可修改(Key/Value只读) | 可增删改键值对 |
| 类型安全 | 泛型版本强类型 | Dictionary 强类型;Hashtable 弱类型 |
| 使用场景 | 作为遍历元素、临时传递数据 | 存储和查找大量关联数据 |
❌ 错误。字典是集合,键值对是集合里的一个元素。就像“汽车”和“轮胎”的关系。
⚠️ 不全是。Hashtable 是旧版非泛型,键值类型都是 object,使用时会装箱,且不是类型安全。Dictionary<TKey, TValue> 是泛型版,类型安全、性能更好。新项目永远用 Dictionary。
❌ 错误。KeyValuePair 的 Key 是只读的。如果想改键,只能删除旧的再添加新的。
csharp
var kvp = new KeyValuePair<string, int>("苹果", 5);
// kvp.Key = "梨子"; // ❌ 编译错误:Key 是只读的
| 场景 | 用什么 | 原因 |
|---|---|---|
| 存储用户信息(ID → 姓名) | Dictionary<int, string> | 需要通过 ID 快速查找姓名 |
| 遍历字典时处理每一条数据 | KeyValuePair | 遍历时自动返回这个类型 |
| 从数据库加载配置项(Key-Value 表) | Dictionary<string, string> | 通过配置名快速取值 |
| 方法返回一个键值对 | KeyValuePair 或 Tuple | 临时返回一对数据,无需完整字典 |
| 需要线程安全的哈希表 | ConcurrentDictionary | 多线程环境专用 |
csharp
// 1. 创建一个字典(哈希表)
var inventory = new Dictionary<string, int>
{
["苹果"] = 10,
["香蕉"] = 5,
["橙子"] = 8
};
// 2. 查找
int appleCount = inventory["苹果"]; // 快速查找
// 3. 遍历(每个元素是 KeyValuePair)
foreach (KeyValuePair<string, int> item in inventory)
{
Console.WriteLine($"{item.Key} 库存:{item.Value} 个");
}
// 4. 单独创建一个键值对(用于临时传递)
var singleItem = new KeyValuePair<string, int>("西瓜", 2);
Console.WriteLine($"临时数据:{singleItem.Key} = {singleItem.Value}");
哈希表(
Dictionary)是一个容器,用来高效存储和查找多个键值对;而键值对(KeyValuePair)是容器里的一个条目,用来表示“一个键对应一个值”的关系。
开发建议:
Dictionary<TKey, TValue>KeyValuePair<TKey, TValue>(foreach 自动返回)KeyValuePair 或 TupleHashtable(除非维护 10 年前的老项目)本文作者:ZeroEngineer
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!