Dictionary
官方文檔:http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
而Directory<T,T>是HashTable的泛型模式,用KeyValuePair<T,T>來遍歷Directory<T,T>。
Dictionary泛型 中的任何鍵都必須是唯一的。鍵不能為空引用,但是如果值類型 TValue 為引用類型,該值則可以為空。
Dictionary 調用 Add 方法之前使用 ContainsKey 方法測試某個鍵是否存在,否則得到一個KeyNotFoundException。
if (!openWith.ContainsKey("ht")) { openWith.Add("ht", "hypertrm.exe"); Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]); }
當程序頻繁嘗試字典中不存在的鍵時,使用 TryGetValue 方法來檢索值,這種方法是一種更有效的檢索值的方法。
string value = ""; if (openWith.TryGetValue("tif", out value)) { Console.WriteLine("For key = \"tif\", value = {0}.", value); }
測試鍵是否存在的最有效的方法
// The indexer throws an exception if the requested key is not in the dictionary. try { Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]); } catch (KeyNotFoundException) { Console.WriteLine("Key = \"tif\" is not found."); }
相關文檔:https://msdn.microsoft.com/zh-cn/library/kw5aaea4(v=vs.110).aspx
字典集合的兩種遍歷
Dictionary<string, string> dictionary = new Dictionary<string,string>(); foreach (string dic in dictionary.Keys) { //Key: dic //Value: dictionary[dic] } foreach (KeyValuePair<string, string> dic in dictionary { //Key: dic.Key //Value: dic.Value }
KeyValuePair
結構體,定義可設置或檢索的鍵/值對。
性能比自定義結構體查,可閱讀:http://www.cnblogs.com/Artemisblog/p/3706054.html
示例
/// <summary> /// 設置鍵/值對 /// </summary> /// <returns></returns> private KeyValuePair<int, string> SetKeyValuePair() { int intKey = 1; string strValue = "My value"; KeyValuePair<int, string> kvp = new KeyValuePair<int, string>(intKey, strValue); return kvp; } /// <summary> /// 獲得鍵/值對 /// </summary> private void GetKeyValuePairDemo() { KeyValuePair<int, string> kvp = SetKeyValuePair(); int intKey = kvp.Key; string strValue = kvp.Value; }
http://www.cnblogs.com/Artemisblog/p/3706054.html
http://www.cnblogs.com/KTblog/p/4392248.html
HashTable
描述
用於處理和表現類似keyvalue的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;value用於存儲對應於key的值。Hashtable中keyvalue鍵值對均為object類型,所以Hashtable可以支持任何類型的keyvalue鍵值對.
Hashtable每個元素都是一個存儲在 DictionaryEntry 對象中的鍵/值對。鍵不能為 空引用,但值可以。
二,哈希表的簡單操作
Hashtable hshTable = new Hashtable(); // 創建哈希表 hshTable .Add("Person1", "zhanghf"); // 往哈希表里添加鍵值對 hshTable .Clear(); //移除哈希表里所有的鍵值對 hshTable .Contains("Person1"); //判斷哈希表里是否包含該鍵 string name = (string)hshTable["Person1"].ToString(); //取哈希表里指定鍵的值 hshTable.Remove("Person1"); // 刪除哈希表里指定鍵的鍵值對 IDictionaryEnumerator en = hshTable.GetEnumerator(); // 遍歷哈希表所有的鍵,讀出相應的值 while (en.MoveNext()) { string str = en.Value.ToString(); } // 循環hashtable foreach (DictionaryEntry de in hshtable) {...}
可以使用Dictionary實現的時候,不要用哈希表。使用值類型時,它需要進行封箱和拆箱,耗費內存資源,效率比較低。
http://www.cnblogs.com/liuwenjun830/archive/2006/07/28/462182.html【推薦】
http://www.cnblogs.com/yangleiWPF/archive/2010/11/16/1878494.html
http://www.cnblogs.com/gjcn/archive/2008/07/07/1234560.html
參考文章:
C#中Dictionary的用法【推薦】
http://jingyan.baidu.com/article/9989c7460ab872f648ecfeed.html
C#中鍵值對類型Hashtable與Dictionary比較和相關用法
http://www.2cto.com/kf/201304/201715.html
Hashtable與Dictionary雖然都是作為鍵值對的載體,但是采用的是不同的數據結構。就像Java中的ArrayList與LinkList,雖然都是實現了List接口作為集合載體,但其內部結構是不一樣的,
ArrayList是通過數組實現的,LinkList是通過對象鏈表實現的。 由於 Hashtable 和 Dictionary 同時存在, 在使用場景上必然存在選擇性, 並不任何時刻都能相互替代. [1] 單線程程序中推薦使用 Dictionary, 有泛型優勢, 且讀取速度較快, 容量利用更充分. [2] 多線程程序中推薦使用 Hashtable, 默認的 Hashtable 允許單線程寫入, 多線程讀取, 對 Hashtable 進一步調用 Synchronized() 方法可以獲得完全線程安全的類型.
而 Dictionary 非線程安全, 必須人為使用 lock 語句進行保護, 效率大減. [3] Dictionary 有按插入順序排列數據的特性 (注: 但當調用 Remove() 刪除過節點后順序被打亂), 因此在需要體現順序的情境中使用 Dictionary 能獲得一定方便. 個人偏向於使用Dictionary,因為其使用泛型,可控性比較強。在一些資料中,很多人也推薦使用Dictionary,其原因主要有 1、Dic是類型安全的,這有助於我們寫出更健壯更具可讀性的代碼,而且省卻我們強制轉化的麻煩。 2、Dic是泛行的,當K或V是值類型時,其速度遠遠超過Hashtable。處理對象時不需要進行顯式或是隱式轉型,進行值類型處理時不需要裝箱。所以使用方便一些,
而且效率會高一些(編碼效率、運行效率),還不太容易出錯。