2

我有四个 Dictionary ,两个是(字典中的字典),声明如下

    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();

值正在添加,但是在添加 set_value 和 reset_value 字典后,我想清除这两个字典 set_value 和 reset_value,但是当 set_value 和 reset_value 被清除时,dict_set 和 dict_reset 中的数据也被清除。

任何人都可以帮助我,在这种情况下如何创建字典的深层副本......

4

4 回答 4

6

我不知道您在工作流程中要做什么,但为什么不重新实例化而不是清理?

dict_set.Clear(); 

至:

dict_set = new Dictionary<string, string>(); 
于 2013-07-03T09:06:34.740 回答
1

除了 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* 字典。

于 2013-07-03T09:10:07.693 回答
0

通过创建新实例将解决上述问题..如果有人遇到其他更好的解决方案,请发布..

     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();
于 2013-07-03T09:54:35.243 回答
0

我认为这样 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 添加和删除数据也不会影响 dict_set 和 dict_Reset 中的字典

只是出于好奇,为什么 Reset_value 带有大写 S 而 set_value 不是?

于 2013-07-03T11:11:33.353 回答