首页
学习
活动
专区
工具
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的 # dict的key必须是不可变对象的验证案例 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

3K50
  • 学习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

    68330

    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 集合推导式 与字典推导式类似, 集合推导式使用的也是花括号...它们之间有许多的相同点和不同点。 图片

    61920

    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.9K90

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

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

    26800

    Python语法(1)

    字典(Dictionary): 字典是一种键-值对的数据类型,用于存储具有关联关系的数据。深入了解字典的操作方法和用途。...容器类型的使用: 列表操作: 包括添加元素、删除元素、切片等,了解列表的可变性。 元组的不可变性: 元组的不可变性使其适用于存储不希望被修改的数据。...字典的键值对: 学习如何使用字典存储和检索数据。 变量的动态性: 动态类型系统: Python 是一种动态类型语言,变量的类型是在运行时确定的。...C#: Python和C#是两种不同类型的编程语言,它们在变量声明和类型系统上存在一些显著的区别。...列表可以包含不同类型的元素,而字典则是键值对的集合。

    12810

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

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

    61290

    函数—Python基础授课备课

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

    27430

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

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

    84890

    python(三)

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

    47800

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

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

    2.9K20

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

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

    72560

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

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

    62750

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

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

    49010

    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

    .NET IL实现对象深拷贝

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

    29730

    欢迎来到 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)”受保护的属性。

    1K30
    领券