C# Hashtable(哈希表)

Hashtable 是一个存储键值对的非泛型集合,类似于泛型 Dictionary <TKey,TValue> 集合。它通过计算每个键的哈希码优化查找,并在内部将其存储在不同的 bucket 中,然后在访问值时匹配指定键的哈希码。

哈希表特性

  • Hashtable 存储键值对。

  • 属于System.Collection命名空间。

  • 实现IDictionary接口。

  • 键必须是唯一的,不能为null。

  • 值可以为null或重复。

  • 可以通过在索引器中传递相关键来访问值,例如 myHashtable[key]

  • 元素作为 DictionaryEntry 对象存储。

创建哈希表(HashTable)

下面的示例演示如何创建哈希表和添加元素。

Hashtable numberNames = new Hashtable();
numberNames.Add(1,"One"); //使用Add()方法添加键/值
numberNames.Add(2,"Two");
numberNames.Add(3,"Three");

//以下引发运行时异常:已添加键。run-time exception: key already added.
//numberNames.Add(3, "Three"); 

foreach(DictionaryEntry de in numberNames)
    Console.WriteLine("Key: {0}, Value: {1}", de.Key, de.Value);
		
//使用collection-initializer语法创建Hashtable
var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};
		
foreach(DictionaryEntry de in cities)
    Console.WriteLine("Key: {0}, Value: {1}", de.Key, de.Value);

Hashtable集合可以包括字典的所有元素,如下所示。

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "one");
dict.Add(2, "two");
dict.Add(3, "three");

Hashtable ht = new Hashtable(dict);

更新哈希表

通过在索引器中传递一个键,可以从 Hashtable 中检索现有键的值。Hashtable 是一个非泛型集合,因此在检索它时必须键入强制转换值。

//使用collection-initializer语法创建Hashtable
var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};
    
string citiesOfUK = (string) cities["UK"]; //转换为字符串
string citiesOfUSA = (string) cities["USA"]; //转换为字符串

Console.WriteLine(citiesOfUK);
Console.WriteLine(citiesOfUSA);

cities["UK"] = "Liverpool, Bristol"; // 更新 UK 的值
cities["USA"] = "Los Angeles, Boston"; //更新 USA 的值

if(!cities.ContainsKey("France")){
    cities["France"] = "Paris";
}

删除哈希表中的元素

Remove ()方法删除与 Hashtable 中指定的值匹配的键值。如果在 Hashtable 中没有找到指定的键,则抛出 KeyNotfoundException,因此在删除之前使用 ContainsKey ()方法检查现有的键。

使用Clear()方法可以一次性删除所有元素。

var cities = new Hashtable(){
	{"UK", "London, Manchester, Birmingham"},
	{"USA", "Chicago, New York, Washington"},
	{"India", "Mumbai, New Delhi, Pune"}
};

cities.Remove("UK"); // 删除UK
//cities.Remove("France"); //引发运行时异常:KeyNotFoundException

if(cities.ContainsKey("France")){ // 取出键之前先检查一下
    cities.Remove("France");
}

cities.Clear(); //删除所有元素

哈希表类层次结构

下图说明了Hashtable类的层次结构。

C#哈希表