我想我的自定義集合存儲爲鍵和值也是字符串List.I的集合,同時使用KeyvaluePair和hashtable.What是最合適的collction這給了我在靈活性方面更具有優勢可以實現這一目標?.NET中的KeyValuePair和Hashtable有什麼區別?
回答
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
一個相關位是Hashtable是一個.NET 1.1類,而KeyValuePair引入在.NET 2.0。 (與引入泛型)
Hashtable的是,當C#不支持泛型尚未建立。
- 1. C#中ArrayList和Hashtable有什麼區別?
- 2. @ {}和[Hashtable] :: Clear()之間有什麼區別?
- 3. .net 4.0和.net 4.0.3有什麼區別?
- 4. b/w Hashtable,Dictionary和KeyValuePair有什麼不同?
- 5. .NET和ASP.NET有什麼區別嗎
- 6. C#和.NET有什麼區別?
- 7. .NET double和python float有什麼區別?
- 8. C#.net和Visual Basic.net有什麼區別?
- 9. Netduino和.NET Gadgeteer有什麼區別?
- 10. 有什麼區別`和$(Bash中有什麼區別?
- 11. Java中的Hashtable中的Set keys()和Set keyset()之間有什麼區別?
- 12. Dictionary和Hashtable之間的主要區別是什麼
- 13. Hashtable和Properties之間的區別是什麼?
- 14. .NET中的System.Collections,System.Collections.Specialized和System.Collections.Generic有什麼區別?
- 15. .NET中的lambda表達式和謂詞有什麼區別?
- 16. .Net中的ConcurrentQueue和BlockingCollection之間有什麼區別?
- 17. .NET中的「global :: System」和「System」有什麼區別?
- 18. .NET RegEx中的組和匹配有什麼區別?
- 19. .Net中的App.Config和Web.Config有什麼區別?
- 20. .net中的readonly屬性和函數有什麼區別?
- 21. .NET中的X509Certificate2和X509Certificate有什麼區別?
- 22. .NET 4中的EnumerateFiles和EnumerateFileSystemEntries有什麼區別?
- 23. .NET微型框架和.NET精簡框架有什麼區別?
- 24. 有什麼區別? :和||
- 25. &&和||有什麼區別?
- 26. 「/」和「/ *」有什麼區別?
- 27. 有什麼區別:。!和:r!?
- 28. ==和===有什麼區別?
- 29. Appender和〜有什麼區別?
- 30. $ @和$ *有什麼區別?
此外,您無法使用鍵值訪問List的元素。正如這裏所暗示的,您需要迭代列表以找到您想要的密鑰。而HashTable將允許您使用密鑰作爲索引訪問您的值。 – jheddings 2009-11-23 05:19:43
謝謝@jheddings,我添加了代碼註釋以指示元素是否被索引位置或鍵訪問,以闡明您所說的內容。 – 2009-11-23 06:00:15