首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#有办法给我一个不可变的字典吗?

在C#中,字典本身是可变的,但是可以通过将字典封装在一个不可变的类中来实现不可变的字典。以下是一个简单的示例:

代码语言:csharp
复制
using System.Collections.Generic;
using System.Collections.ObjectModel;

public class ImmutableDictionary<TKey, TValue>
{
    private readonly IDictionary<TKey, TValue> _dictionary;

    public ImmutableDictionary()
    {
        _dictionary = new Dictionary<TKey, TValue>();
    }

    public ImmutableDictionary(IDictionary<TKey, TValue> dictionary)
    {
        _dictionary = new ReadOnlyDictionary<TKey, TValue>(dictionary);
    }

    public TValue this[TKey key] => _dictionary[key];

    public bool ContainsKey(TKey key) => _dictionary.ContainsKey(key);

    public bool TryGetValue(TKey key, out TValue value) => _dictionary.TryGetValue(key, out value);

    public ImmutableDictionary<TKey, TValue> Add(TKey key, TValue value)
    {
        var newDictionary = new Dictionary<TKey, TValue>(_dictionary);
        newDictionary.Add(key, value);
        return new ImmutableDictionary<TKey, TValue>(newDictionary);
    }

    public ImmutableDictionary<TKey, TValue> Remove(TKey key)
    {
        var newDictionary = new Dictionary<TKey, TValue>(_dictionary);
        newDictionary.Remove(key);
        return new ImmutableDictionary<TKey, TValue>(newDictionary);
    }
}

这个类实现了一个不可变的字典,可以通过AddRemove方法添加和删除元素,但是这些方法会返回一个新的不可变字典,而不是修改原始字典。这样可以确保字典的不可变性。

需要注意的是,由于这个类使用了ReadOnlyDictionary来实现只读字典,因此它不能被序列化为JSON或XML格式。如果需要序列化,可以使用其他方法来实现不可变字典。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python3 与 C# 基础语法对比(List、Tuple、Dict、Set专栏-新排版)

# 由于在遍历过程中,删除了其中一个元素,导致后面的元素整体前移,导致个元素成了漏网之鱼。 # 同样,在遍历过程中,使用插入操作,也会导致类似的错误。这也就是问题里说无法“跟踪”元素。...可变元组(元组在定义时候就不能变了,但是可以通过类似这种方式来改变) 案例里面用到了列表和字典(本章讲解,这边你先看看) 参照C#可变元组会更容易懂 # 扩展:可变元组(元组在定义时候就不能变了...:元组是可以作为Key # dictkey必须是不可变对象验证案例 key1=(1,2,3) key2=[1,2,3] key3={"1":"2"} dic={} # 元组是不可变类型,可以当key...,两种办法 # 一是通过in判断key是否存在: print("mmd" in infos_dict) False # 二是通过dict提供get()方法 infos_dict.get("name"...2 6.CSharp字典系列 6.1.定义、遍历 C#字典操作大家比较熟悉了,而且挺简单,就一笔带过了 //定义 var infos_dict = new Dictionary<string, object

2.8K50

学习Python一年,这次终于弄懂了浅拷贝和深拷贝

(y) # 深拷贝我来了 那浅拷贝和深拷贝什么区别呢,你能给我讲讲?...) 举个例子,假设有一个列表L和一个字典D: >>> L = [2019, 2020, 2021] >>> D = {'1':2019, '2':2020, '3':2021} >>> >>> A =...把100追加到l1,对l2没有影响 l1内部列表l1[1中55删除,对l2也产生影响,因为l1[1]和l2[1]绑定是同一个列表 对可变对象来说,l2[1引用列表进行+=就地修改列表。...拷贝方法如下: 可变类型切片操作:[:] 工厂函数(如list/dir/set) 字典copy方法(X.copy()) 然后就是Python专门copy标准库模块:包含两个方法copy()和deepcopy...本文内容参考: 中文网址:将你代码运行可视化 《流畅Python》-- 第 8 章 对象引用、可变性和垃圾回收 《Python3标准库》-- 2.9 copy — Duplicate Objects

58630

Python 集合

它是由 0 个或多个唯一、不可变元素构成无序组合。和字典一样,集合也是通过一对花括号{}来标识。 集合中元素是不可重复, 常常用于检查某个元素是否存在。...集合元素不能是可变类型,例如列表、字典或者集合本身。 虽然集合中元素必须是不可变类型,但是集合本身是可变,可以添加、删除和清空集合元素。...,返回True,否则返回False x not in S 如果x不是S元素,返回True,否则返回False ---- 2.1 添加元素 与列表、字典一样, 集合是可变类型。...(language) language.remove('C++') print(language) language.remove('C#') ---- 2.3 集合推导式 与字典推导式类似, 集合推导式使用也是花括号...它们之间许多相同点和不同点。 图片

58720

Python dict(字典)

特性(博客最后将从实现方式来说明为什么是这样): 键必须是唯一,但值不必。 键和值可以是任何数据类型,键必须是不可变,如字符串、数字或者包含可变元素tuple,不能用list等可变元素。...(seq[,value]) 创建一个字典,以序列seq中元素做字典键,val为字典所有键对应初始值 radiansdict.get(key, default=None) 返回指定键值,如果值不在字典中返回...Python中dict也即Java/C++/C#Map,其键值对映射关系是通过哈希算法来实现。...因此存储时候先对k使用方法H(可以多种方法这里不做详细介绍)计算出存储地址p,而需要访问时候再根据对k做H运算以求得p。...键必须是不可变:键如果可变,则经由H方法计算出地址也是可变,这样就导致键值对这种存储形式完全混乱。

1.8K90

函数—Python基础授课备课

第三章 函数 自定义函数 C#方法≈Python函数 定义函数 以找最大数实现为例,分别由C#和Python来写 首先是C# public int find_max(int num1, int...圆括号里面放参数,都不需要定义类型 冒号,然后换行缩进 方法体 可有可无return 此图来自菜鸟教程 函数传值与返回 在C#里面我们知道,参数分实参和形参,反正就是要一个带数据类型关键词 在...,除了已定义,其他都存在kwargs字典里面 Python里面的返回值就比较随意了,想返回我就来个return,不想返回我就不写,诶我就是玩儿。...在Python里面都不是,而是“传对象引用” 如果接受到可变对象,那就可以修改原始值:列表,字典 如果接受到是不可变对象,那就不可以修改原始对象:字符串,元组,数字 Python字符串那些骚操作...这里就没什么好说了,直接这样查看字符串哪些方法了。

24130

​面试20kPython工程师,聊了这26个问题,个个都是经典!

一位朋友,最近在面试Python开发工程师工作,期望薪资:18-20k,他反馈给我一些面试题,我从中选出了26个比较有价值题目,分享给大家。...谈谈对元类编程理解绿色协程是什么?python字典key,什么特征?不能重复值键必须是不可变可hash类型,如字符串,数字或元组。...所以:列表不能作为字典key谈谈装饰器,说一下实际工作中用法生成器和迭代器关系django和flask区别django中f查询和q查询区别django中drf继承了哪些类?...使用过哪些协程框架,了解过FastAPI?二、通用技能请说一下操作系统三级缓存在多线程中如何保持数据一致性用过k8s?...手写一个Web框架,你会考虑哪些方面?快速排序、递归逻辑和使用场景。这本书,背下来:巴尔加瓦《算法图解》jwt中token由哪几部分组成?验证原理是什么?

23900

一个32岁入门70后程序员给我启示

(这也带给我一个启示,作为男人,如果觉得职业看不到头,趁早换工作吧,如果趁早,你会在以后家庭压力中选择妥协,再也看不到头了。)...会灵活运用?从前辈学习方法来看,记录一些常用代码片段还是很用必要,你github一套自己代码片段?如果没有那就赶紧收集!)...这是它给我提供串口应答式发送流程(可能有错) 我把我爸逼成了伪全栈 大二时候我,学了C#,会做一下简单winform程序,然后就开始飘飘然了,跟我爸吹牛了,当时我爸高兴坏了,直接就给我接了一个真实项目...,没办法啊,只能让我爸去学吧,一个星期后,他开始于我并行开发,这是我跟我爸同台工作最好回忆;为什么我爸能够在一个星期学会C#(只有C语音基础)?...做一名守信用程序员 我爸当时给我说:”既然你答应了人家,无论你千百个理由都要给人家完成,完成不了就是你错,因为你对人家承诺过“。

58290

python(三)

1.元组遍历操作   在python所有的不可变类型里面,一个比较重要就是元组(tuple),如果某个值被定义为元组,那就意味着他值不能修改,除非重新定义一个对象。...@新建一个元组    常见元组和创建列表办法很类似,只不过元组里面用到是圆括号,中间用逗号隔开。   ...@字典创建和使用      字典组成:字典是由大括号{  }来包含其数据,大括号里面包含键和其对应值,一个键对应一个值或者一个空项,键和值使用冒号隔开,项和项之间用逗号隔开,空字典就是包含任何项大括号...,字典键必须是不可变数据类型,如果用元组做键,你必须要保证元组内对象也是不可变类型,可变数据类型对象不能做键。     ...@字典删除办法,           del方法:删除对应键值,del空格变量名[键名],如果只写变量名就是删除此字典           clear方法:清空字典内容,变量名.clear()

46500

一个32岁入门70后程序员给我启示

(这也带给我一个启示,作为男人,如果觉得职业看不到头,趁早换工作吧,如果趁早,你会在以后家庭压力中选择妥协,再也看不到头了。)...会灵活运用?从前辈学习方法来看,记录一些常用代码片段还是很用必要,你github一套自己代码片段?如果没有那就赶紧收集!)...这是它给我提供串口应答式发送流程(可能有错) 我把我爸逼成了伪全栈 大二时候我,学了C#,会做一下简单winform程序,然后就开始飘飘然了,跟我爸吹牛了,当时我爸高兴坏了,直接就给我接了一个真实项目...,没办法啊,只能让我爸去学吧,一个星期后,他开始于我并行开发,这是我跟我爸同台工作最好回忆;为什么我爸能够在一个星期学会C#(只有C语音基础)?...做一名守信用程序员 我爸当时给我说:”既然你答应了人家,无论你千百个理由都要给人家完成,完成不了就是你错,因为你对人家承诺过“。

79990

Python从入门到精通,这篇文章为你列出了25个关键技术点(附代码)

为什么选择 Python (劣势) 与其他语言 (C++,C#,Java) 相比,Python 程序运行更慢,这是因为Python 中缺少类似 Just In Time 优化器支持。...** 参数 ** 允许传递可变数量关键字参数给函数,同时也可以传递一个字典值作为关键字参数。 Return 函数能够返回一个值,如下所示。 ?...字典 Dictionaries 字典是编程语言中最重要一种数据结构之一,它能够存储键值对 (key/value) 对象。 字典许多优点,能够轻松地进行数据检索,如下所示。 ?...可以通过如下方式创建一个字典。 ? 打印字典内容,如下所示。 ? 字典值可以是任意类型数据,包括字符串,数值,布尔型,列表甚至是字典,如下所示。 ?...类一个实例称为对象。对象具有可变性,一旦创建对象,相应属性也将被更新。 __init__ __init__ 函数在所有类中都存在。当需要进行类实例化时,该函数就将被执行。

2.9K20

lua实例教程_lua教程网

Lua处理从C#获得数组、字典、结构体等 方式1迭代器遍历以及转化为table后循环 方式2类似C#调用以及相关注意事项 …待续(持续更新中) 参考与引用 Lua配置、安装、与运行 1.进入Lua...*/ // 是否可变参数 lu_byte is_vararg; // 该函数需要栈大小 lu_byte maxstacksize; /* number of registers needed by...因为可变参数实际数量只有调用者才知道,所以maxstacksize包含可变参数数量。...获得数组、字典、结构体等 方式1迭代器遍历以及转化为table后循环 local testData = CS.LuaCallCSUtils.GetTestData() --为一个字典 local iter...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

1.9K20

一个32岁入门70后程序员给我启示

(这也带给我一个启示,作为男人,如果觉得职业看不到头,趁早换工作吧,如果趁早,你会在以后家庭压力中选择妥协,再也看不到头了。)...会灵活运用?从前辈学习方法来看,记录一些常用代码片段还是很用必要,你github一套自己代码片段?如果没有那就赶紧收集!)...( 这是它给我提供串口应答式发送流程(可能有错)) 我把我爸逼成了伪全栈 大二时候我,学了C#,会做一下简单winform程序,然后就开始飘飘然了,跟我爸吹牛了,当时我爸高兴坏了,直接就给我接了一个真实项目...,没办法啊,只能让我爸去学吧,一个星期后,他开始于我并行开发,这是我跟我爸同台工作最好回忆;为什么我爸能够在一个星期学会C#(只有C语音基础)?...做一名守信用程序员 我爸当时给我说:”既然你答应了人家,无论你千百个理由都要给人家完成,完成不了就是你错,因为你对人家承诺过“。

60050

一个32岁入门70后程序员给我启示

(这也带给我一个启示,作为男人,如果觉得职业看不到头,趁早换工作吧,如果趁早,你会在以后家庭压力中选择妥协,再也看不到头了。)...会灵活运用?从前辈学习方法来看,记录一些常用代码片段还是很用必要,你 github 一套自己代码片段?如果没有那就赶紧收集!)...这是它给我提供串口应答式发送流程(可能有错) 我把我爸逼成了伪全栈 大二时候我,学了 C#, 会做一下简单 winform 程序,然后就开始飘飘然了,跟我爸吹牛了,当时我爸高兴坏了,直接就给我接了一个真实项目...,没办法啊,只能让我爸去学吧,一个星期后,他开始于我并行开发,这是我跟我爸同台工作最好回忆;为什么我爸能够在一个星期学会 C#(只有 C 语言基础)?...做一名守信用程序员 我爸当时给我说:” 既然你答应了人家,无论你千百个理由都要给人家完成,完成不了就是你错,因为你对人家承诺过 “。

68160

一个32岁入门70后程序员给我启示

(这也带给我一个启示,作为男人,如果觉得职业看不到头,趁早换工作吧,如果趁早,你会在以后家庭压力中选择妥协,再也看不到头了。)...会灵活运用?从前辈学习方法来看,记录一些常用代码片段还是很用必要,你github一套自己代码片段?如果没有那就赶紧收集!)...这是它给我提供串口应答式发送流程(可能有错) 我把我爸逼成了伪全栈 大二时候我,学了C#,会做一下简单winform程序,然后就开始飘飘然了,跟我爸吹牛了,当时我爸高兴坏了,直接就给我接了一个真实项目...,没办法啊,只能让我爸去学吧,一个星期后,他开始于我并行开发,这是我跟我爸同台工作最好回忆;为什么我爸能够在一个星期学会C#(只有C语音基础)?...做一名守信用程序员 我爸当时给我说:”既然你答应了人家,无论你千百个理由都要给人家完成,完成不了就是你错,因为你对人家承诺过“。

45610

欢迎来到 C# 9.0(Welcome to C# 9.0)

C# 9.0 正在成形,我想和大家分享一下我们对下一版本语言中添加一些主要特性想法。 对于 C# 一个新版本,我们都在努力让常见编码场景实现变得更加清晰和简单,C# 9.0 也例外。...记录与可变性(Records and mutation) 记录(record)基于值语义不能很好地适应可变状态。想象一下,将一个记录(record)对象放入字典中。...记录(record)内部可变状态或许一些有效高级用法,特别是对于缓存。但是重写默认行为以忽略这种状态所涉及手工工作很可能是相当大。...C# 实现了这一点。记录(record)一个隐藏虚方法(virtual method),它被委托“克隆”整个对象。...同样,C# 会自动为您处理这个问题。实现方式是,记录一个名为 EqualityContract “虚(virtual)”受保护属性。

99030

.NET IL实现对象深拷贝

可以先用C#编写代码,然后将它复制到LINQPad中,运行并打开输出中IL选项卡。 使用像JetBrainsdotPeek这样反编译/反汇编程序也是一个不错选择。...我们主要方法Copy(T orig)将调用上下文方法来检查字典中拷贝对象是否存在: public static T Copy(T original, CopyContext context...如果传入是“不可变对象”,则直接返回传入对象; 如果传入是一个数组,则将每个元素复制到一个新数组中并将其返回; 创建一个传入类型实例,递归地将每个字段从传入对象复制到拷贝对象并返回。...对“不可变对象”定义很简单:类型是一个基原类型、Enum、String、Guid、DateTime...,或者使用特殊[Immutable]标记类型。...三种情况需要考虑,每种情况对应下面代码中一个块: 该类型是一个值类型(结构)。使用default(T)表达式来初始化它。 该类型一个无参数构造函数。通过调用new T()初始化它。

21130
领券