Hashtable 是一个存储键值对的非泛型集合,类似于泛型 Dictionary <TKey,TValue> 集合。它通过计算每个键的哈希码优化查找,并在内部将其存储在不同的 bucket 中,然后在访问值时匹配指定键的哈希码。
Hashtable 存储键值对。
属于System.Collection命名空间。
实现IDictionary接口。
键必须是唯一的,不能为null。
值可以为null或重复。
可以通过在索引器中传递相关键来访问值,例如 myHashtable[key]
元素作为 DictionaryEntry 对象存储。
下面的示例演示如何创建哈希表和添加元素。
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类的层次结构。