C# – 替代 Hashtable 沒有泛型的方案

嘛~
雖然Hashtable在某些地方很好用,但在某些情況下,反而成了礙手礙腳的。
Hashtable裡面的物件都是存成object,倘若要不斷的使用物件,就要不斷的轉型…
一來折損不少效能,二來程式碼看起來就很不舒服

其實,解決方法有很多種,只是找不到有詳盡介紹 C# 所有Collections的好文章。
最根本的做法就是直接去實作Collections使用的介面,但是又整個很麻煩的感覺。
一直在想,都有List<>的泛型了,為啥沒有對應
Hashtable的泛型咧~
今天終於給我咕到一個好用的Collections可以取代之!

【C#食谱】【面食】菜单5:用泛型副本替换哈希表

從原本的…

 Hashtable myList = new Hashtable();
 myList.Add("第一項", "內容");
 String tempStr = myList["第一項"] as String;

換成…

 Dictionary<String, String> myList = new Dictionary<String, String>();
 myList.Add("第一項", "內容");
 String tempStr =
myList["第一項"];

嗯~
單從這短短幾行或許感覺不出來,但是當很多地方要用到就會整個很討厭了
主要還是要考慮消耗效能的問題,動態轉型很吃的…
當然,若是用來存放各種類型的物件,還是乖乖用Hashtable吧!


2008/10/04 Edit

SortedList Class」和「SortedDictionary Class」也是支援泛型的。

另外找到一篇比較這三者的優劣…可參考參考
[原创]Dictionary, SortedDictionary, SortedList 横向评测

 ADD FIND REMOVE
 Dictionary  265ms  203ms  187ms
 SortedDictionary  1843ms  828ms  1234ms
 SortedList  N/A  N/A  N/A

這是項目數量設為1,000,000個,尋找和移除500,000次的耗費時間。

 ADD FIND REMOVE
 Dictionary  15ms  31ms  15ms
 SortedDictionary  93ms  46ms  38ms
 SortedList  8031ms  15ms  6046ms

這是將項目數量和次數改為1/10之後的結果。
SortedList 不知道再慢什麼的

4. 小结
如果只
是当作索引使用, 请用 Dictionary.

如果需要查找最小的几个元素, 或者需要按顺序遍历元素, 就用 SortedDictionary.
如果输入/删除的元素是基本增序的, 或者访问次数远多于修改次数, 或者需要访问第 k 大的元素, 或者对内存吝啬得 BT 的情况, 用 SortedList 吧. (它居然成使用情况最多的了… orz)

再來個Dictionary vs Hashtable!

 ADD FIND REMOVE
 Dictionary(Of Long, Long)  217ms
 203ms  187ms
 Dictionary(Of Object, Object)  468ms  312ms  234ms
 Hashtable  859ms  390ms  218ms

结论: 最好用 Dictionary 代替 Hashtable.

–End

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.