C#实现Dictionary字典赋值的方法
作者:Czhenya 发布时间:2021-12-09 17:55:40
标签:C#,Dictionary,字典,赋值
Dictionary<TKey,TValue> 类,表示键和值的集合。
Dictionary<TKey,TValue> 泛型类提供一组键到一组值的映射。 每次对字典的添加都包含一个值和与其关联的键。 使用其键检索值的速度非常快。
之前使用Dictionary,也没遇到什么问题,感觉很方便,通过键值对的形式进行新建 – 存储 – 校验Key/Value是否存在 – 读取 – 修改/移除维护,一切正常。 近期取犯了一个不应该犯的错 – 赋值。
class Program
{
static List<List<int>> handCards = new List<List<int>>();
static void Main(string[] args)
{
//声明 赋值
Dictionary<int, int> dic1 = new Dictionary<int, int>();
dic1.Add(1, 1);
dic1.Add(2, 2);
Dictionary<int, int> dic2 = dic1;
dic2.Add(3, 3);
dic2.Add(4, 4);
foreach (var item in dic1.Keys)
{
Console.WriteLine("dic1 : " + dic1[item]);
}
foreach (var item in dic2.Keys)
{
Console.WriteLine("dic2 : " + dic2[item]);
}
}
}
这种赋值的方式是直接将dic2指向了dic1的内存地址,其实就是一个人,叫两个名字而已,所以这时不管你叫谁他都有反应, 即对dic1和dic2进行的所有操作都是一个内存地址进行修改,也就是说对dic1修改就是对dic2修改。
对于这种概念,我们最初学习引用类型的时候就已经有过接触了,所以说,大家也基本不会犯这样的错误。
需要注意的是,当我们使用Dic作为参数的时候,对它遍历时,尽量不要在外部对它进行添加/删除元素,否则可能会遇到这错:Unity 报错 之 InvalidOperationException: out of sync。
还有一种情况就是,当我们需要多个操作校验的时候,有多个方法同时执行,对这个Dic进行操作,也会产生问题。
那么,问题来了,想像值类型那么赋值该怎么写呢?
class Program
{
static List<List<int>> handCards = new List<List<int>>();
static void Main(string[] args)
{
//声明 赋值
Dictionary<int, int> dic3 = new Dictionary<int, int>();
dic3.Add(1, 1);
dic3.Add(2, 2);
//相当于值类型赋值
Dictionary<int, int> dic4 = new Dictionary<int, int>(dic3);
dic4.Add(3, 3);
dic4.Add(4, 4);
foreach (var item in dic3.Keys)
{
Console.WriteLine("dic3 : " + dic3[item]);
}
foreach (var item in dic4.Keys)
{
Console.WriteLine("dic4 : " + dic4[item]);
}
}
}
这样的话就可以只是用Dictionary的值,新开辟了一块内存地址,而不会对它本身有影响。
来源:https://blog.csdn.net/Czhenya/article/details/103673322


猜你喜欢
- 实验目的在C#和Rest/Restful以及其它的Web服务交互过程中,大量使用到JSON传递数据,如何快捷的转化C#对象到JSON和转化J
- Stream简化元素计算一、接口设计从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作
- 1. 前言不知道小伙伴对于日期字段,在项目中都是如何处理的,是单独给每个字段都自定义日期格式还是做全局格式设置?这个我之前啊,是
- 原因是新建类的模板被更改了,匹配符变成了大写,并且没有默认修饰符。不想自己改的,粘上去就好了,不过我只加了默认的。#if (${PACKAG
- 本文介绍C#编程时,给定一个字符串,如何判断它是不是一个日期。本文将介绍两种方法,一个是判断字符串是否是时间,如果是就转换为一个时间变量,第
- 1.单文件上传首先创建一个Spring Boot项目,并添加spring-boot-starter-web依赖然后创建一个upload.js
- ASP.NET MVC中进行分页的方式有多种,但在NuGet上使用最广泛的就是用PagedList、X.PagedList.Mvc进行分页。
- 概述一天之计在于晨,每天的早餐也是必不可少,但是很多人为了节约时间,都是简单的吃点凑合一下或干脆不吃早餐,这对于个人身体和工作效率来说,无疑
- 欢迎大家来学习本节内容,前几节我们已经学习了其他几种自定义控件,分别是Andriod 自定义控件之音频条及 Andriod 自定义控件之创建
- 前言:我们都知道Android开发者的必备工具:AndroidStudio。是开发人员用来编译、测试的专用工具。今天在使用And
- 一、让ListView控件显示表头的方法在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Columns集
- 本文实例讲述了Java基本数据类型与类型转换。分享给大家供大家参考,具体如下:相关内容:基本数据类型整型浮点型字符型布尔型数据类型转换数组首
- AutoRestEvent 类用于从一个线程向另一个线程发送通知。微软文档是这样介绍的:表示线程同步事件在一个等待线程释放后收到信号时自动重
- Android多点触控涉及到的知识点1、ScaleGestureDetector 2、OnScaleGestureListener 3、Ma
- 开发中最让人头疼的是应用突然 * ,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误
- 程序在32位操作系统上运行正常,在64位操作系统上运行读卡功能提示”试图加载格式不正确“。-------------------------
- String类基本概念String类属于引用数据类型,不属于基本数据类型。在Java中只要是" "(双引号)中的,都是S
- 本文实例为大家分享了Spring AOP实现记录操作日志的具体代码,供大家参考,具体内容如下1 添加maven依赖<dependenc
- 本文实例讲述了C#读取或设置ScrollLock状态的方法。分享给大家供大家参考。具体如下:C#读取或者设置ScrollLock状态,允许滚
- 面向对象有封装、继承、多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反