C#中的"字典嵌套"?

Fla*_*ano 3 c#

我是C#的初学者,我正在努力做到以下几点:

我创建了一个词典: _innerProducts = new Dictionary<string, string>();

然后另一个字典来存储第一个字典: _KitProducts = new Dictionary<string, Dictionary<string, string>>();

第一个(_ innerProducts)包含我从和.xml文件中收集的大约15个产品属性,而TKey是产品代码.

收集我调用的所有属性后:

_KitProducts.Add(_innerProducts["cProd"], _innerProducts);
Run Code Online (Sandbox Code Playgroud)

当我通过调试观察它时,它的工作正常,我可以看到:

在清除之前

问题是我不能使用与第一个_innerProducts"cProd" 相同的TKey添加另一组属性,因此在foreach中我将一个_innerProducts.Clear();放在最后.

问题是当我清除它时,它不仅清除了当前的_innerProducts,它还清除了_KitProducts的TValue:

清除之后

我不确定这是因为那些"引用"而不是我读过的"按价值"讲座(记得我刚开始),所以在这种情况下该怎么做?

这将是很多这样的情况,我知道我将需要存储它(但我仍然没有学习实体框架,正在研究它),而那,我只是存储在字典中学习目的.

谢谢,抱歉英语,不是我的主要语言.

Hei*_*nzi 5

将值添加到外部字典后,_innerProducts外部字典条目的值都引用同一个对象:

             +-----------------------+
             | your inner dictionary |
             +-----------------------+
                ^          ^
                |          |
      _innerProducts      value in the outer dictionary entry
Run Code Online (Sandbox Code Playgroud)

执行时_innerProducts.Clear(),使用以下结果清空该字典:

             +-----------------------+
             |    empty dictionary   |
             +-----------------------+
                ^          ^
                |          |
      _innerProducts      value in the outer dictionary entry
Run Code Online (Sandbox Code Playgroud)

因此,不是清空现有实例,而是创建一个新实例,即替换

_innerProducts.Clear();     // "a.DoSomething()" operates on the object referenced by a
Run Code Online (Sandbox Code Playgroud)

_innerProducts = new Dictionary<string, string>();    // "a = ..." defines which object a refers to
Run Code Online (Sandbox Code Playgroud)

这导致以下情况:

   +-----------------------+    +-----------------------+
   |   a new, empty dict.  |    | your inner dictionary |
   +-----------------------+    +-----------------------+
                         ^          ^
                         |          |
               _innerProducts      value in the outer dictionary entry
Run Code Online (Sandbox Code Playgroud)

这样,您不会修改现有的内部字典,而是让变量_innerProducts指向一个新字典.

如果可能的话,更简单,更好:移动用于填充的循环_innerProducts 内部的声明_KitProducts.这将确保每个循环迭代获得自己的内部字典实例.