原文連結:https://blog.csdn.net/heyuchang666/article/details/50503240?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50503240-blog-104036330.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-50503240-blog-104036330.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=2
一Hashtable 和 Dictionary <K, V> 型別
1):單執行緒程式中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分.
2):多執行緒程式中推薦使用 Hashtable, 預設的 Hashtable 允許單執行緒寫入, 多執行緒讀取, 對 Hashtable 進一步呼叫 Synchronized()方法可以獲得完全執行緒安全的型別. 而Dictionary 非執行緒安全, 必須人為使用 lock 語句進行保護, 效率大減.
3):Dictionary 有按插入順序排列資料的特性 (注: 但當呼叫 Remove() 刪除過節點後順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便.
在使用雜湊表儲存集合元素(一種鍵/值對)時,首先要根據鍵自動計算雜湊程式碼,以確定該元素的儲存位置,再把元素的值放入相應位置所指向的儲存桶中。在查詢時,再次透過鍵所對應的雜湊程式碼到特定儲存桶中搜尋,這樣將大大減少為查詢一個元素進行比較的次數。
HashTable中的key/value均為object型別,由包含集合元素的儲存桶組成。儲存桶是 HashTable中各元素的虛擬子組,與大多數集合中進行的搜尋和檢索相比,儲存桶可令搜尋和檢索更為便捷。每一儲存桶都與一個雜湊程式碼關聯,該雜湊程式碼是使用雜湊函式生成的並基於該元素的鍵。HashTable的優點就在於其索引的方式,速度非常快。如果以任意型別鍵值訪問其中元素會快於其他集合,特別是當資料量特別大的時候,效率差別尤其大。
HashTable的應用場合有:做物件快取,樹遞迴演算法的替代,和各種需提升效率的場合。
二、雜湊表Hashtabl
Hastable是雜湊表的實現,能根據關鍵字取關鍵值,這key的型別是object, value的型別也是object。
在雜湊表中新增一個key/value鍵值對:HashtableObject.Add(key,value);
在雜湊表中去除某個key/value鍵值對:HashtableObject.Remove(key);
從雜湊表中移除所有元素: HashtableObject.Clear();
判斷雜湊表是否包含特定鍵key: HashtableObject.Contains(key);
遍歷Hashtable物件的兩種方法:
由於Hashtable每個元素都是一個鍵/值對,因此元素型別既不是鍵的型別,也不是值的型別,而是DictionaryEntry型別。
Hashtable示例程式碼
<pre name="code" class="csharp">Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//方法一 foreach (System.Collections.DictionaryEntry de in myHashtable) { //注意HastTable記憶體儲的預設型別是object,需要進行轉換才可以輸出 Console.WriteLine(de.Key.ToString()); Console.WriteLine(de.Value.ToString()); }
//方法二
System.Collections.IDictionaryEnumerator enumerator = myHashtable.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Key); // Hashtable關健字 Console.WriteLine(enumerator.Value); // Hashtable值 }
三、字典Dictionary
Dictionary<Tkey,Tvalue>是Hastbale的泛型實現。
<span style="font-size:18px;">Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//遍歷鍵 foreach (string key in myDictionary.Keys) { //遍歷某鍵的值 foreach (string val in myDictionary[key]) { } }</span> 由於 Dictionary 是鍵和值的集合,因此元素型別並非鍵型別或值型別。相反,元素型別是鍵型別和值型別的 KeyValuePair 。 <span style="font-size:18px;">字典遍歷示例 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->foreach (KeyValuePair<string, string> kvp in myDictionary) { string key = kvp.Key;//key包含了字典裡的鍵 for (int i = 0; i < kvp.Value.Count; i++) { Response.Write(kvp.Value[i]); } }</span>
示例 :
程式碼
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->//定義一個<string,int>的Dictionary,讓它的值進行新增(也可以用Add方法) Dictionary<string, int> dic = new Dictionary<string, int>(); //新增兩個鍵為"成績1","成績2";併為它們的值賦為0 dic["成績1"] = 0; dic["成績2"] = 0; // 把這兩個值分別加1 dic["成績1"]++; dic["成績2"]++;