如何在c#中对dictionary中的词典进行深度复制
本文关键字:复制 深度 中对 dictionary | 更新日期: 2023-09-27 18:20:52
我有四个字典,其中两个是(字典中的字典),声明如下所示
Dictionary<string, Dictionary<string, string>> dict_set = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, Dictionary<string, string>> dict_Reset = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> set_value = new Dictionary<string, string>();
Dictionary<string, string> Reset_value = new Dictionary<string, string>();
我想首先在字典set_vlaue和Reset_value中添加元素。添加值后,我将这些字典添加到其他两个字典中,如下所示。
dict_set.Add(condiName, set_value);
dict_Reset.Add(condiName, Reset_value);
set_value.Clear();
Reset_value.Clear();
值正在被添加,但在添加了setvalue和reset_value字典后,我想清除这两个字典setvalue和reset_value,但问题出现了,当setvalue和eset_value被清除时,dictset和dictreset中的数据也被清除。。
有人能帮助我吗,在这种情况下如何创建字典的深度副本。。。
我不知道你在工作流程中想做什么,但为什么不重新测试而不是清洗呢?
dict_set.Clear();
至:
dict_set = new Dictionary<string, string>();
除了Skeet在keyboardP指出的答案中所写的内容外,在大多数托管语言中,您可以很容易地通过以下方式执行深度复制:
- 序列化事物
- 反序列化回
在反序列化之后,通常会有一个完整的原始文件的深度克隆。序列化程序通常会进行所有的ID检查、中断周期、重复数据消除等。在您的情况下,这不是必要的,但稍后可能会派上用场。
您可以将其序列化为XML、BinaryForm、JSON或任何您喜欢并手头有的内容。这并没有那么重要。
现在回到您的问题:
这是你的代码,只是缩短了一点:
var dict_set = new Dictionary<string, Dictionary<string, string>>();
var dict_Reset = new Dictionary<string, Dictionary<string, string>>();
var set_value = new Dictionary<string, string>();
var Reset_value = new Dictionary<string, string>();
dict_set.Add(condiName, set_value);
dict_Reset.Add(condiName, Reset_value);
set_value.Clear();
Reset_value.Clear();
您声称:
(…),但当set_value和reset_value被清除时,来自dict_set和dict_reset的数据也被清除。。
这不是事实。使用上面的代码,这是不可能的。set/reset/dict_set/dict_reset是4个不同的对象。在"设置/重置"上调用"清除"不会导致其他内容被清除。
查看您的代码。错误在别处。不在这里。另一件事是清理字典。
通过创建新实例将解决上述问题。。如果有人遇到其他更好的解决方案,请发帖。。
dict_set.Add(condiName, new Dictionary<string, string>(set_value));
dict_Reset.Add(condiName, new Dictionary<string, string>(Reset_value));
set_value.Clear();
Reset_value.Clear();
我认为这样dict_set和dict_Reset中的内部字典就不会被清除
dict_set.Add(condiName, set_value.ToDictionary(entry => entry.Key,entry => entry.Value));
dict_Reset.Add(condiName, Reset_value.ToDictionary(entry => entry.Key,entry => entry.Value));
set_value.Clear();
Reset_value.Clear();
使用ToDictionary()方法,您实际上创建了一个新的Dictionary对象,不再使用引用来遍历原始字典,因此可以安全地清除它们。向set_value和Reset_value alsdo添加和删除数据不会影响dict_set和dict_Reset 中的字典
出于安全考虑,为什么用大写S重置值,而不使用set_value?