C#中Hashtable和Dictionary的区别与用法示例
作者:zls365 发布时间:2023-10-05 03:22:59
前言
在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
Hashtable与Dictionary,都是key/value键值对的形式,区别在于Hashtable的键值是object(DictionaryEntry),值类型,数据排列是乱序的;而Dictionary是泛型(KeyValuePair<T, T>),引用类型,按插入顺序排列数据
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 即可。
总结
来源:https://mp.weixin.qq.com/s/crdRlcVHIbySZku5nqCmAA


猜你喜欢
- 关于Fresco的优点大家自行谷歌吧,它太强大太优秀了,我这一片小博文容纳不下啊羡慕,今天主要给大家简单介绍下Fresco的使用以及一些属性
- 在基于UI元素的自动化测试中, 无论是桌面的UI自动化测试,还是Web的UI自动化测试. 首先我们需要查找和识别UI
- 本文实例讲述了C#使用windows服务开启应用程序的方法。分享给大家供大家参考。具体如下:使用windows服务开启应用程序,会遇到如下问
- 概述众所周知使用 JWT 做权限验证,相比 Session 的优点是,Session 需要占用大量服务器内存,并且在多服务器时就会涉及到共享
- 前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home
- 目录SpringBoot 配置文件加密编码其他SpringBoot 配置文件加密本章将对SpringBoot配置文件中的数据加密做自定义开发
- 还记得我们之前说的ListView吗,(这个难用的控件-。+)我们在用他的同时也用到了一个叫做适配器Adapter的东西。一般我们用一个类继
- springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
- 本文实例为大家分享了C#基于Sockets类实现TCP通讯的具体代码,供大家参考,具体内容如下最终效果TCPClientusing Syst
- 微信开发API如何接入服务器,下面就为大家进行介绍一、说明* 本示例根据微信开发文档:http://mp.weixin.qq.com/wik
- PopupWindow是一个弹出式窗口,它可以展示任意View。他会浮在当前窗口的上方展示。下面看代码:public class MyAct
- public interface AttributeSet { /** * Retur
- 本文实例为大家分享了java实现银行家算法的具体代码,供大家参考,具体内容如下题目:初始时,Allocate[i,j]=0,表示初始时没有进
- 0x00 前言在一些比较极端情况下,C3P0链的使用还是挺频繁的。0x01 利用方式利用方式在C3P0中有三种利用方式http baseJN
- spring FactoryBean 是创建 复杂的bean,一般的bean 直接用xml配置即可,如果一个bean的创建过程中
- 看前欣赏美图!上才艺!目录 一.顺序结构二.分支结构1.if语句2.switch 语句 三. 循环结构1 .while 循环2. break
- 由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功
- 本文实例讲述了C#静态构造函数用法。分享给大家供大家参考。具体如下:当我们想初始化一些静态变量的时候,就需要用到静态构造函数了。这个静态构造
- 这篇文章主要介绍了java获取当前时间并格式化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 前言前一篇文章讲了View的触发反馈机制的原理,对于一个自定义View而言,手势的处理都是重写onTouchEvent函数,或者通过setO