C#中哈希表(HashTable)的用法详解
1. ?哈希表(HashTable)簡述
? 在.NET Framework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似keyvalue的鍵值對,其中key通常可用來快速查找,同時(shí)key是區(qū)分大小寫;value用于存儲對應(yīng)于key的值。Hashtable中keyvalue鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對.
2. 什么情況下使用哈希表
(1)某些數(shù)據(jù)會被高頻率查詢
(2)數(shù)據(jù)量大
(3)查詢字段包含字符串類型
(4)數(shù)據(jù)類型不唯一
?3.?哈希表的使用方法
哈希表需要使用的namespace
using System.Collections; using System.Collections.Generic;?
哈希表的基本操作:
//添加一個(gè)keyvalue鍵值對: HashtableObject.Add(key,value);//移除某個(gè)keyvalue鍵值對: HashtableObject.Remove(key);//移除所有元素: HashtableObject.Clear(); // 判斷是否包含特定鍵key: HashtableObject.Contains(key);?
控制臺程序例子:
using System; using System.Collections; //file使用Hashtable時(shí),必須引入這個(gè)命名空間 class Program {public static void Main(){Hashtable ht = new Hashtable(); //創(chuàng)建一個(gè)Hashtable實(shí)例ht.Add("北京", "帝都"); //添加keyvalue鍵值對ht.Add("上海", "魔都");ht.Add("廣州", "省會");ht.Add("深圳", "特區(qū)");string capital = (string)ht["北京"];Console.WriteLine(ht.Contains("上海")); //判斷哈希表是否包含特定鍵,其返回值為true或falseht.Remove("深圳"); //移除一個(gè)keyvalue鍵值對ht.Clear(); //移除所有元素} }?
?哈希表中使用多種數(shù)據(jù)類型的例子:
using System; using System.Collections;class Program {static Hashtable GetHashtable(){Hashtable hashtable = new Hashtable();hashtable.Add("名字", "小麗");hashtable.Add("年齡", 22);return hashtable;}static void Main(){Hashtable hashtable = GetHashtable();string name = (string)hashtable["名字"];Console.WriteLine(name);int age = (int)hashtable["年齡"];Console.WriteLine(age);} }?
?當(dāng)獲取哈希表中數(shù)據(jù)時(shí),如果類型聲明的不對,會出現(xiàn)InvalidCastException錯(cuò)誤。使用as-statements可以避免該錯(cuò)誤。
using System; using System.Collections; using System.IO;class Program {static void Main(){Hashtable hashtable = new Hashtable();hashtable.Add(100, "西安");// 能轉(zhuǎn)換成功string value = hashtable[100] as string;if (value != null){Console.WriteLine(value);}// 轉(zhuǎn)換失敗,獲取的值為null,但不會拋出錯(cuò)誤。StreamReader reader = hashtable[100] as StreamReader;if (reader == null){Console.WriteLine("西安不是StreamReader型");}// 也可以直接獲取object值,再做判斷object value2 = hashtable[100];if (value2 is string){Console.Write("這個(gè)是字符串型: ");Console.WriteLine(value2);}} }?
4. 遍歷哈希表
?遍歷哈希表需要用到DictionaryEntry Object,代碼如下:
for(DictionaryEntry de in ht) //ht為一個(gè)Hashtable實(shí)例 {Console.WriteLine(de.Key); //de.Key對應(yīng)于keyvalue鍵值對keyConsole.WriteLine(de.Value); //de.Key對應(yīng)于keyvalue鍵值對value }?
遍歷鍵
foreach (int key in hashtable.Keys) {Console.WriteLine(key); }?
遍歷值
foreach (string value in hashtable.Values) {Console.WriteLine(value); }?
5. 對哈希表進(jìn)行排序
? 對哈希表按key值重新排列的做法:
ArrayList akeys=new ArrayList(ht.Keys); akeys.Sort(); //按字母順序進(jìn)行排序 foreach(string key in akeys) {Console.WriteLine(key + ": " + ht[key]); //排序后輸出 }?
6. 哈希表的效率
System.Collections下的哈希表(Hashtable)和System.Collections.Generic下的字典(Dictionary)都可用作lookup table,下面比較一下二者的執(zhí)行效率。
Stopwatch sw = new Stopwatch(); Hashtable hashtable = new Hashtable(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); int countNum = 1000000;sw.Start(); for (int i = 0; i < countNum; i++) {hashtable.Add(i.ToString(), i); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 744sw.Restart(); for (int i = 0; i < countNum; i++) {dictionary.Add(i.ToString(), i); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 489sw.Restart(); for (int i = 0; i < countNum; i++) {hashtable.ContainsKey(i.ToString()); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 245sw.Restart(); for (int i = 0; i < countNum; i++) {dictionary.ContainsKey(i.ToString()); } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 192由此可見,添加數(shù)據(jù)時(shí)Hashtable快。頻繁調(diào)用數(shù)據(jù)時(shí)Dictionary快。
結(jié)論:Dictionary<K,V>是泛型的,當(dāng)K或V是值類型時(shí),其速度遠(yuǎn)遠(yuǎn)超過Hashtable。
轉(zhuǎn)載于:https://www.cnblogs.com/chenmfly/p/4883106.html
總結(jié)
以上是生活随笔為你收集整理的C#中哈希表(HashTable)的用法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发常用工具推荐
- 下一篇: iOS开发之网络编程--6、NSURLS