C#中哈希表(HashTable)用法實(shí)例詳解(添加/移除/判斷/遍歷/排序等)
本文實(shí)例講述了C#中哈希表(HashTable)用法。分享給大家供大家參考,具體如下:
1. 哈希表(HashTable)簡(jiǎn)述
在.NET Framework中,Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類似keyvalue的鍵值對(duì),其中key通常可用來快速查找,同時(shí)key是區(qū)分大小寫;value用于存儲(chǔ)對(duì)應(yīng)于key的值。Hashtable中keyvalue鍵值對(duì)均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對(duì).
2. 什么情況下使用哈希表
(1)某些數(shù)據(jù)會(huì)被高頻率查詢
(2)數(shù)據(jù)量大
(3)查詢字段包含字符串類型
(4)數(shù)據(jù)類型不唯一
3. 哈希表的使用方法
哈希表需要使用的namespace
using System.Collections; using System.Collections.Generic;
哈希表的基本操作:
//添加一個(gè)keyvalue鍵值對(duì): HashtableObject.Add(key,value); //移除某個(gè)keyvalue鍵值對(duì): HashtableObject.Remove(key); //移除所有元素: HashtableObject.Clear(); // 判斷是否包含特定鍵key: HashtableObject.Contains(key);
控制臺(tái)程序例子:
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鍵值對(duì)
ht.Add("上海", "魔都");
ht.Add("廣州", "省會(huì)");
ht.Add("深圳", "特區(qū)");
string capital = (string)ht["北京"];
Console.WriteLine(ht.Contains("上海")); //判斷哈希表是否包含特定鍵,其返回值為true或false
ht.Remove("深圳"); //移除一個(gè)keyvalue鍵值對(duì)
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í),如果類型聲明的不對(duì),會(huì)出現(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,但不會(huì)拋出錯(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對(duì)應(yīng)于keyvalue鍵值對(duì)key
Console.WriteLine(de.Value); //de.Key對(duì)應(yīng)于keyvalue鍵值對(duì)value
}
遍歷鍵
foreach (int key in hashtable.Keys)
{
Console.WriteLine(key);
}
遍歷值
foreach (string value in hashtable.Values)
{
Console.WriteLine(value);
}
5. 對(duì)哈希表進(jìn)行排序
對(duì)哈希表按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); //輸出: 744
sw.Restart();
for (int i = 0; i < countNum; i++)
{
dictionary.Add(i.ToString(), i);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 489
sw.Restart();
for (int i = 0; i < countNum; i++)
{
hashtable.ContainsKey(i.ToString());
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds); //輸出: 245
sw.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。
更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#遍歷算法與技巧總結(jié)》、《C#程序設(shè)計(jì)之線程使用技巧總結(jié)》、《C#操作Excel技巧總結(jié)》、《C#中XML文件操作技巧匯總》、《C#常見控件用法教程》、《WinForm控件用法總結(jié)》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#數(shù)組操作技巧總結(jié)》及《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》
希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
C# Redis學(xué)習(xí)系列(一)Redis下載安裝使用
這篇文章主要為大家分享了C# Redis學(xué)習(xí)系列教程第一篇, Redis下載、安裝、使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
比Math類庫(kù)abs()方法性能更高的取絕對(duì)值方法介紹
這篇文章主要給大家介紹了一種比Math類庫(kù)abs()方法性能更高的取絕對(duì)值方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法
這篇文章主要介紹了C#利用XML創(chuàng)建Excel文檔的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-08-08
C# 使用匿名函數(shù)解決EventHandler參數(shù)傳遞的難題
C#動(dòng)態(tài)生成PictureBox并綁定右鍵菜單,實(shí)現(xiàn)刪除圖片2009-05-05
C#編程實(shí)現(xiàn)簡(jiǎn)易圖片瀏覽器的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)簡(jiǎn)易圖片瀏覽器的方法,涉及C#基于WinForm操作圖片實(shí)現(xiàn)預(yù)覽功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
C#自定義導(dǎo)出數(shù)據(jù)到Excel的類實(shí)例
這篇文章主要介紹了C#自定義導(dǎo)出數(shù)據(jù)到Excel的類,實(shí)例分析了C#操作Excel的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03

