Hashtable和Dictionary都是.Net下的表示键值对的集合,那么我们在使用中该选择Hashtable还是Dictionary?下边我们看看他们之间的区别:
1、Dictionary<K,V>在使用中是顺序存储的,而Hashtable由于使用的是哈希算法进行数据存储,是无序的。
2、Dictionary的key和value是泛型存储,Hashtable的key和value都是object
3、Dictionary是泛型存储,不需要进行类型转换,Hashtable由于使用object,在存储或者读取值时都需要进行类型转换,所以比较耗时
4、单线程程序中推荐使用 Dictionary, 有泛型优势, 且读取速度较快, 容量利用更充分。多线程程序中推荐使用 Hashtable, 默认的 Hashtable 允许单线程写入, 多线程读取, 对 Hashtable 进一步调用 Synchronized() 方法可以获得完全线程安全的类型. 而 Dictionary 非线程安全, 必须人为使用 lock 语句进行保护, 效率大减。
5、在通过代码测试的时候发现key是整数型Dictionary的效率比Hashtable快,如果key是字符串型,Dictionary的效率没有Hashtable快。
对于如何进行选择,个人倾向于使用Dictionary,原因是:
1、Dictionary是可排序的,Hashtable如果想排序还需要采用别的方式进行
2、Dictionary有泛型优势,效率要高
Hashtable用法举例:
Hashtable hashtable = new Hashtable();hashtable.Add("id", "BH0001");hashtable.Add("name", "TM");hashtable.Add("sex", "男");Console.WriteLine("\t 键\t 值");foreach (DictionaryEntry dicEntry in hashtable)Console.WriteLine("\t " + dicEntry.Key + "\t " + dicEntry.Value);
运行结果:
Dictionary用法举例:
Dictionary<string,string> dictionary = new Dictionary<string, string>();dictionary.Add("id", "BH0001");dictionary.Add("name", "TM");dictionary.Add("sex", "男");Console.WriteLine("\t 键\t 值");foreach (var dic in dictionary)Console.WriteLine("\t " + dic.Key + "\t " + dic.Value);
运行结果:
C# .net 3.5 以上的版本引入 Linq 后,字典Dictionary排序变得十分简单,用一句类似 sql 数据库查询语句即可搞定;不过,.net 2.0 排序要稍微麻烦一点。下面举例说明dictionary的排序方法:
dictionary按值value排序
Dictionary<string, int> dic = new Dictionary<string, int>();dic.Add("index.html", 50);dic.Add("product.html", 13);dic.Add("aboutus.html", 4);dic.Add("online.aspx", 22);dic.Add("news.aspx", 18);
private static void DictonarySort(Dictionary<string, int> dic){var dicSort = from objDic in dic orderby objDic.Value descending select objDic;foreach (KeyValuePair<string, int> kvp in dicSort)Console.WriteLine(kvp.Key + ":" + kvp.Value );}
排序结果:
index.html:50
online.aspx:22
news.aspx:18
product.html:13
aboutus.html:4
上述代码是按降序(倒序)排列,如果想按升序(顺序)排列,只需要把变量 dicSort 右边的 descending 去掉即可。
C# dictionary key 排序
如果要按 Key 排序,只需要把变量 dicSort 右边的 objDic.Value 改为 objDic.Key 即可。