2009-11-23 70 views

回答

14

Hashtable是隨機訪問和內部使用System.Collections.DictionaryEntry其項目從.NET 1.1;而.NET 2.0中的強類型System.Collections.Generic.Dictionary使用System.Collections.Generic.KeyValuePair項,並且也是隨機訪問。

(注:提供的例子時,這個答案向.NET 2.0框架偏見 - 這就是爲什麼它有KeyValuePair代替的DictionaryEntry繼續 - 原來的問題表明,這是需要的類型與工作)

由於KeyValuePair是一個獨立的類,可以手動進行KeyValuePair實例的列表或陣列,但是列表或陣列將被順序地訪問。這與內部創建自己的元素實例並隨機訪問的哈希表或字典相反。兩者都是使用KeyValuePair實例的有效方法。另見see MSDN info about selecting a Collection class to use

總結:當使用一小組項目時,順序訪問速度最快,而較大的項目組受益於隨機訪問。

微軟的混合溶液:一個有趣的專門收集引入在.NET 1.1是System.Collections.Specialized.HybridDictionary其使用ListDictionary內部表示(按順序訪問的),而收集小,並且然後自動切換到一個Hashtable內部表示 (隨機訪問)當收藏變大」

C#示例代碼

下面的示例顯示了不同的場景創建的同一個鍵 - 值對實例 - 順序訪問(兩個例子),隨後是一個隨機訪問的例子。爲了簡化這些示例,它們都將使用帶有字符串值的int鍵 - 可以替換您需要使用的數據類型。

這裏的鍵值對的強類型System.Collections.Generic.List。
(順序存取)

// --- Make a list of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
List<KeyValuePair<int, string>> listKVP = new List<KeyValuePair<int, string>>(); 
listKVP.Add(new KeyValuePair<int, string>(1, "one")); 
listKVP.Add(new KeyValuePair<int, string>(2, "two")); 
// access first element - by position... 
Console.Write("key:" + listKVP[0].Key + "value:" + listKVP[0].Value); 

這裏的鍵值對的的System.Array。
(順序存取)

// --- Make an array of 3 Key-Value pairs (sequentially accessed) --- 
// build it... 
KeyValuePair<int, string>[] arrKVP = new KeyValuePair<int, string>[3]; 
arrKVP[0] = new KeyValuePair<int, string>(1, "one"); 
arrKVP[1] = new KeyValuePair<int, string>(2, "two"); 
// access first element - by position... 
Console.Write("key:" + arrKVP[0].Key + "value:" + arrKVP[0].Value); 

這裏的鍵值對的字典。
(隨機存取)

// --- Make a Dictionary (strongly typed) of 3 Key-Value pairs (randomly accessed) --- 
// build it ... 
Dictionary<int, string> dict = new Dictionary<int, string>(); 
dict[1] = "one"; 
dict[2] = "two"; 
// access first element - by key... 
Console.Write("key:1 value:" + dict[1]); // returns a string for key 1 
+3

此外,您無法使用鍵值訪問List的元素。正如這裏所暗示的,您需要迭代列表以找到您想要的密鑰。而HashTable將允許您使用密鑰作爲索引訪問您的值。 – jheddings 2009-11-23 05:19:43

+0

謝謝@jheddings,我添加了代碼註釋以指示元素是否被索引位置或鍵訪問,以闡明您所說的內容。 – 2009-11-23 06:00:15

2

一個相關位是Hashtable是一個.NET 1.1類,而KeyValuePair引入在.NET 2.0。 (與引入泛型)

2

Hashtable的是,當C#不支持泛型尚未建立。

相關問題