C#中Hashtable和Dictionary的區(qū)別
Hashtable 和 Dictionary 都是 C# 中用于存儲(chǔ)鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)
哈希表 Hashtable
使用Hashtable需要引入命名空間System.Collections。Hashtable中key/value的鍵值對(duì)均為object類(lèi)型,所以Hashtable可以支持任何類(lèi)型的key/value鍵值對(duì),Hashtable中每個(gè)對(duì)象是一個(gè)存儲(chǔ)在DictionaryEntry對(duì)象中的鍵值對(duì)。
常用屬性
屬性 | 描述 |
---|---|
Count | 獲取Hashtable中包含的鍵值對(duì)個(gè)數(shù) |
Keys | 獲取Hashtable中所有鍵的集合 |
Values | 獲取Hashtable中所有值的集合 |
常用方法
方法 | 描述 |
---|---|
public virtual void Add(object key, object value); | 向Hashtable添加一個(gè)帶有指定的鍵和值的元素 |
public virtual bool ContainsKey(object key); | 判斷Hashtable是否包含指定的鍵 |
public virtual bool ContainsValue(object value); | 判斷Hashtable是否包含指定的值 |
public virtual void Remove(object key); | 從Hashtable中移除指定的鍵的元素 |
public virtual void Clear(); | 從Hashtable中移除所有的元素 |
注意:由于IDictionary接口是鍵/值對(duì)的非泛型集合的基接口,而每個(gè)元素都是鍵/值對(duì),并存儲(chǔ)在DictionaryEntry對(duì)象中,因此元素類(lèi)型既不是鍵的類(lèi)型,也不是值的類(lèi)型,而是DictionaryEntry類(lèi)型。(留個(gè)坑,自己也沒(méi)搞明白是啥)
Hashtable ht = new Hashtable(); ht.Add(1, true); ht.Add(2, "FALSE"); Console.WriteLine("當(dāng)前包含鍵值對(duì)個(gè)數(shù):{0}", ht.Count);//輸出:2 Console.WriteLine("---- 通過(guò)鍵求鍵值對(duì) ----"); foreach (var key in ht.Keys) { Console.WriteLine("{0} - {1}", key, ht[key]);//輸出:2-"FALSE" 1-True } Console.WriteLine("---- 添加后值的集合 ----"); foreach (var value in ht.Values) { Console.WriteLine("{0}", value);//輸出:FALSE True } if (ht.ContainsKey(1)) { Console.WriteLine("Hashtable中包含鍵 1 .");//輸出 } if(ht.ContainsValue(true)) { Console.WriteLine("Hashtable中包含值 true .");//輸出 } ht.Remove(1); Console.WriteLine("---- 移除鍵 1 之后 ----"); foreach(DictionaryEntry de in ht) { Console.WriteLine("{0} - {1}", de.Key, de.Value);//輸出:2 - FALSE } ht.Clear(); Console.WriteLine("---- 移除全部之后 ----"); foreach (DictionaryEntry de in ht) { Console.WriteLine("{0} ------- {1}", de.Key, de.Value);//無(wú)輸出 } Console.ReadKey();
字典 Dictionary
Dictionary<TKey, TValue>包含在System.Collections.Generic命名空間中。Dictionary<TKey, TValue>可以支持指定的任何類(lèi)型的key/value鍵值對(duì)。所以Dictionary<TKey, TValue>對(duì)象只能添加指定類(lèi)型的key/value鍵值對(duì)。Dictionary<TKey, TValue>中每個(gè)對(duì)象是一個(gè)存儲(chǔ)在KeyValuePair<TKey, TValue>對(duì)象中的鍵值對(duì)。
常用屬性
屬性 | 描述 |
---|---|
Count | 獲取Dictionary<TKey, TValue>中包含的鍵值對(duì)個(gè)數(shù) |
Item | 獲取Dictionary<TKey, TValue>中的某個(gè)鍵值對(duì) |
Keys | 獲取Dictionary<TKey, TValue>中所有鍵的集合 |
Values | 獲取Dictionary<TKey, TValue>中所有值的集合 |
常用方法
方法 | 描述 |
---|---|
public void Add(TKey key, TValue value); | 將指定的鍵和值添加到字典中 |
public bool ContainsKey(TKey key); | 判斷Dictionary<TKey, TValue>是否包含指定的鍵 |
public bool ContainsValue(TValue value); | 判斷Dictionary<TKey, TValue>是否包含指定的值 |
public bool Remove(TKey key); | 從Dictionary<TKey, TValue>中移除指定的鍵的元素 |
public void Clear(); | 從Dictionary<TKey, TValue>中移除所有的鍵值對(duì) |
Dictionary<int, string> dc = new Dictionary<int, string>(); dc.Add(21002121, "張三"); dc.Add(21002122, "李四"); Console.WriteLine("字典中的鍵值對(duì)個(gè)數(shù):{0}", dc.Count);//輸出:2 Console.WriteLine("---- 添加之后鍵值對(duì) ----"); foreach (var item in dc) { Console.WriteLine("{0} - {1}", item.Key, item.Value);//輸出:21002121 - 張三 21002122 - 李四 } Console.WriteLine("---- 通過(guò)鍵求鍵值對(duì) ----"); foreach (var key in dc.Keys) { Console.WriteLine("{0} - {1}", key, dc[key]);//輸出:21002121 - 張三 21002122 - 李四 } Console.WriteLine("---- 添加后值的集合 ----"); foreach (var value in dc.Values) { Console.WriteLine("{0}", value);//張三 李四 } if(dc.ContainsKey(21002121)) { Console.WriteLine("Dictionary中包含鍵 21002121 .");//輸出 } if(dc.ContainsValue("李四")) { Console.WriteLine("Dictionary中包含值 李四 .");//輸出 } dc.Remove(21002121); Console.WriteLine("---- 移除鍵 21002121 之后 ----"); foreach (KeyValuePair<int, string> kp in dc) { Console.WriteLine("{0} - {1}", kp.Key, kp.Value);//輸出:21002122 - 李四 } dc.Clear(); Console.WriteLine("---- 移除全部之后 ----"); foreach (KeyValuePair<int, string> kp in dc) { Console.WriteLine("{0} ----- {1}", kp.Key, kp.Value);//無(wú)輸出 } Console.ReadKey();
Hashtable 與 Dictionary 插入方法的時(shí)間比較
Dictionary<int, int> dc = new Dictionary<int, int>(); Hashtable ht = new Hashtable(); int count = 10000000;//插入的次數(shù) 1千萬(wàn) Stopwatch sw = new Stopwatch(); sw.Start();//計(jì)時(shí) for(int i = 0; i < count; i++) { dc.Add(i, i); } sw.Stop(); Console.WriteLine("字典Dictionary<TKey, TValue>耗時(shí)(毫秒):" + sw.ElapsedMilliseconds);//輸出:388 sw.Restart(); for (int i = 0; i < count; i++) { ht.Add(i, i); } sw.Stop(); Console.WriteLine("哈希表Hashtable耗時(shí)(毫秒):" + sw.ElapsedMilliseconds);//輸出:2497 Console.ReadLine();
注意:所消耗的時(shí)間并不是唯一的,性能一般的電腦建議減低插入次數(shù)
區(qū)別
1. 實(shí)現(xiàn)方式:
Hashtable 是基于哈希表實(shí)現(xiàn)的,而 Dictionary 是基于泛型實(shí)現(xiàn)的。
2. 類(lèi)型安全:
Hashtable 是非泛型的,可以存儲(chǔ)任意類(lèi)型的鍵和值,而 Dictionary 是泛型的,可以指定鍵和值的類(lèi)型,并在編譯時(shí)進(jìn)行類(lèi)型檢查,提供更好的類(lèi)型安全性。
3. 性能:
由于 Hashtabl 是非泛型的,它在存儲(chǔ)和檢索數(shù)據(jù)時(shí)需要進(jìn)行裝箱和拆箱操作,這會(huì)帶來(lái)一定的性能損耗。而 Dictionary 是泛型的,不需要進(jìn)行裝箱和拆箱操作,因此在性能上通常比 Hashtable 更好。
4. 可空鍵和值:
Hashtable 允許存儲(chǔ) null 鍵和 null 值,而 Dictionary 不允許存儲(chǔ) null 鍵和 null 值。
5. 迭代順序:
Hashtable 中的鍵值對(duì)是無(wú)序的,而 Dictionary 中的鍵值對(duì)是按照插入順序排序的。
總結(jié):
- 如果需要一個(gè)類(lèi)型安全、性能較好且不需要存儲(chǔ) null 鍵和 null 值的鍵值對(duì)集合,推薦使用Dictionary。
- 如果需要一個(gè)可以存儲(chǔ)任意類(lèi)型的鍵和值,并且不關(guān)心性能和類(lèi)型安全性的話(huà),可以使用Hashtable。
到此這篇關(guān)于C#中Hashtable 和 Dictionary的區(qū)別的文章就介紹到這了,更多相關(guān)C# Hashtable Dictionary內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)帶進(jìn)度條的ListView
這篇文章主要介紹了C#實(shí)現(xiàn)帶進(jìn)度條的ListView 的相關(guān)資料,需要的朋友可以參考下2016-02-02C#中括號(hào)強(qiáng)轉(zhuǎn)、as、is區(qū)別詳解
本文主要介紹了C#中括號(hào)強(qiáng)轉(zhuǎn)、as、is區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02使用C#對(duì)JSON進(jìn)行序列化和反序列化處理的兩種方法
本指南探討了如何使用 C# 編程語(yǔ)言進(jìn)行 JSON 序列化和反序列化,我們將介紹 .NET 生態(tài)系統(tǒng)中可用的兩個(gè)本機(jī)選項(xiàng),即命名空間和廣泛使用的 Newtonsoft.Json 庫(kù)(也稱(chēng)為 Json.NET),需要的朋友可以參考下2024-06-06