【C#】Dictionary的TryGetValue和Contains效率对比:TryGetValue效率并不一定更好

本文主要是介绍【C#】Dictionary的TryGetValue和Contains效率对比:TryGetValue效率并不一定更好,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

许多文章都推荐大家在C#的Dictionary中使用TryGetValue而不是先ContainsKey判断然后再取值,通过源码我们很容易理解:

这是TryGetValue的源码:

        public bool TryGetValue(TKey key, out TValue value){if (key == null){ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);}lock(_lock){VerifyIntegrity();return TryGetValueWorker(key, out value);}}private bool TryGetValueWorker(TKey key, out TValue value){int entryIndex = FindEntry(key);if (entryIndex != -1){Object primary = null;Object secondary = null;_entries[entryIndex].depHnd.GetPrimaryAndSecondary(out primary, out secondary);// Now that we've secured a strong reference to the secondary, must check the primary again// to ensure it didn't expire (otherwise, we open a ---- where TryGetValue misreports an// expired key as a live key with a null value.)if (primary != null){value = (TValue)secondary;return true;}}value = default(TValue);return false;}

这是ContainsKey和字典索引的源码:

        public bool ContainsKey(TKey key) {return FindEntry(key) >= 0;}public TValue this[TKey key] {get {int i = FindEntry(key);if (i >= 0) return entries[i].value;ThrowHelper.ThrowKeyNotFoundException();return default(TValue);}set {Insert(key, value, false);}}

我们可以看到,先判断key是否存在然后再取值,需要调用两次FindEntry(),因此TryGetValue通常效率约为判断再取值的二倍。

但是,我在某些情况下发现TryGetValue方法速度非常慢,经过测试发现TryGetValue的速度仅为判断再取值的十分之一。这是因为当Dictionary的value是复杂对象的时候,TryGetValue会将value转换为Object再转换为对应类型,这个装箱拆箱过程对复杂对象耗时很高。而字典索引的方法会直接将value的对象返回。

因此,当字典的value是复杂对象的时候,建议大家不要使用TryGetValue。

这篇关于【C#】Dictionary的TryGetValue和Contains效率对比:TryGetValue效率并不一定更好的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/494917

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

C# Hash算法之MD5、SHA

MD5我们用的还是比较多的,一般用来加密存储密码。但是现在很多人觉MD5可能不太安全了,所以都用上了SHA256等来做加密(虽然我觉得都差不多,MD5还是能玩)。 还是跟上一篇说的一样,当一个算法的复杂度提高的同时肯定会带来效率的降低,所以SHA和MD5比较起来的话,SHA更安全,MD5更高效。 由于HASH算法的不可逆性,所以我认为MD5和SHA主要还是应用在字符串的"加密"上。 由于

类的load方法和initialize方法对比

1. load方法在main()之前被调用,而initialize方法在main()之后调用 load方法实际是在load_images过程中被调用的。load_images会将当前应用依赖的所有镜像(动态库)加载到内存,在在加载中首先是对镜像进行扫描,将所有包含 load 方法的类加入列表 loadable_classes ,然后从这个列表中逐一调用其所包含的 load 方法。 +[XXCl