Dictionary、KeyValuePair、Hashtable的比較和使用


 

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。處理對象時不需要進行顯式或是隱式轉型,進行值類型處理時不需要裝箱。所以使用方便一些,
而且效率會高一些(編碼效率、運行效率),還不太容易出錯。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM