在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。C# Hashtable(哈希表)例程,涵盖了哈希表的基本操作、属性访问、线程同步以及性能优化。该程序演示了如何创建哈希表、添加/删除元素、查找元素、遍历集合、处理键冲突,并介绍了其在实际开发中的典型使用场景。

using System;
using System.Collections;

class Program
{
    static void Main(string[] args)
    {
        // 创建一个 Hashtable 实例
        Hashtable hashtable = new Hashtable();

        // 添加键值对
        hashtable.Add("ID001", "Alice");
        hashtable.Add("ID002", "Bob");
        hashtable.Add("ID003", "Charlie");

        Console.WriteLine("初始 Hashtable 内容:");
        PrintHashtable(hashtable);

        // 使用键获取值
        string name = (string)hashtable["ID002"];
        Console.WriteLine($"\n通过键 'ID002' 获取的值是: {name}");

        // 替换已有的键对应的值
        hashtable["ID002"] = "Robert";
        Console.WriteLine("\n更新后的 Hashtable 内容:");
        PrintHashtable(hashtable);

        // 删除指定键的条目
        hashtable.Remove("ID003");
        Console.WriteLine("\n删除键 'ID003' 后的内容:");
        PrintHashtable(hashtable);

        // 检查键是否存在
        bool containsKey = hashtable.ContainsKey("ID004");
        Console.WriteLine($"\n是否包含键 'ID004'? {containsKey}");

        // 获取键的集合和值的集合
        ICollection keys = hashtable.Keys;
        ICollection values = hashtable.Values;

        Console.WriteLine("\n所有键:");
        foreach (string key in keys)
        {
            Console.WriteLine(key);
        }

        Console.WriteLine("\n所有值:");
        foreach (string value in values)
        {
            Console.WriteLine(value);
        }

        // 清空哈希表
        hashtable.Clear();
        Console.WriteLine($"\n清空后 Hashtable 的 Count 为: {hashtable.Count}");

        // 线程安全示例:创建一个同步的 Hashtable
        Hashtable syncHashtable = Hashtable.Synchronized(new Hashtable());
        Console.WriteLine($"\nIsSynchronized(是否线程安全): {syncHashtable.IsSynchronized}");

        // 多线程中使用 SyncRoot 进行同步
        lock (syncHashtable.SyncRoot)
        {
            Console.WriteLine("\n在锁内添加元素以确保线程安全...");
            syncHashtable.Add("ThreadKey", "ThreadValue");
        }

        Console.WriteLine("\n线程安全操作后的内容:");
        PrintHashtable(syncHashtable);
    }

    // 辅助方法:打印 Hashtable 中的所有键值对
    static void PrintHashtable(Hashtable table)
    {
        foreach (DictionaryEntry entry in table)
        {
            Console.WriteLine($"Key: {entry.Key}, Value: {entry.Value}");
        }
    }
}

输出结果:

初始 Hashtable 内容:
Key: ID001, Value: Alice
Key: ID002, Value: Bob
Key: ID003, Value: Charlie

通过键 'ID002' 获取的值是: Bob

更新后的 Hashtable 内容:
Key: ID001, Value: Alice
Key: ID002, Value: Robert
Key: ID003, Value: Charlie

删除键 'ID003' 后的内容:
Key: ID001, Value: Alice
Key: ID002, Value: Robert

是否包含键 'ID004'? False

所有键:
ID001
ID002

所有值:
Alice
Robert

清空后 Hashtable 的 Count 为: 0

IsSynchronized(是否线程安全): True

在锁内添加元素以确保线程安全...

线程安全操作后的内容:
Key: ThreadKey, Value: ThreadValue

程序说明:

  1. 基本操作

    • 使用 Add() 方法向 Hashtable 中添加键值对。

    • 使用索引器 [key] 获取或修改值。

    • 使用 Remove() 删除指定键的条目。

    • 使用 ContainsKey() 判断键是否存在。

  2. 集合访问

    • 通过 KeysValues 属性分别获取所有的键和值。

    • 支持直接遍历 DictionaryEntry 对象进行读取。

  3. 线程安全

    • 使用 Hashtable.Synchronized() 创建线程安全版本的哈希表。

    • 使用 SyncRootlock 语句确保多线程下的安全访问。

  4. 性能特点

    • 查找、插入和删除的时间复杂度平均为 O(1),但在最坏情况下可能退化为 O(n)。

    • 如果键的分布不均或哈希函数设计不好,可能会导致性能下降。

更多推荐