任何让字典存储值而不是指向值的方法

本文关键字:方法 字典 存储 任何 | 更新日期: 2023-09-27 18:00:28

所以我有一个字典:

var tableVars = new Dictionary<string, TableDLL.tableObject>();

和tableObject类:

public class tableObject
    {
        public string Name { get; set; }
        public string Type { get; set; }
        public string Value { get; set; }
        public string Default { get; set; }
    }

我经历了这个循环:

var obj = new TableDLL.tableObject();
        foreach (XmlNode nodes in root.ChildNodes)
        {
            obj.Value = nodes.InnerText;
            tableVars.Add(nodes.Name, obj);
        }

循环完成后,我有65个不同的Dictionary条目,但它们都指向循环中生成的最后一个obj。让Dictionary存储值的最佳方式是什么,而不是简单地指向它(从而随着obj的更改而更改)?我是否必须为每个Dictionary条目制作一个新的TableDLL.tableObject

任何让字典存储值而不是指向值的方法

您只创建了一个对象,并使用最后一个节点不断更新Value。通过更正,您将创建具有适当Value的N个对象。

此:

    var obj = new TableDLL.tableObject();
    foreach (XmlNode nodes in root.ChildNodes)
    {
        obj.Value = nodes.InnerText;
        tableVars.Add(nodes.Name, obj);
    }

应该是这样的:

    foreach (XmlNode nodes in root.ChildNodes)
    {
        var obj = new TableDLL.tableObject();
        obj.Value = nodes.InnerText;
        tableVars.Add(nodes.Name, obj);
    }

obj的创建移动到循环中:

    foreach (XmlNode nodes in root.ChildNodes)
    {
        var obj = new TableDLL.tableObject();
        obj.Value = nodes.InnerText;
        tableVars.Add(nodes.Name, obj);
    }

否则,您将多次添加同一对象。

您只需要在循环中创建它:

foreach (XmlNode nodes in root.ChildNodes)
{
    var obj = new TableDLL.tableObject();
    obj.Value = nodes.InnerText;
    tableVars.Add(nodes.Name, obj);
}

否则,您总是添加相同的对象。

您只创建了一个对象,因此列表不可能有65个不同的对象。

基本上,你所做的是:

  1. 拿一个盒子
  2. 把东西放进盒子里
  3. 现在把那个东西换成另一个

您尚未创建新容器,只是更改了现有容器的内容。

这样做:

    foreach (XmlNode nodes in root.ChildNodes)
    {
        var obj = new TableDLL.tableObject();
        obj.Value = nodes.InnerText;
        tableVars.Add(nodes.Name, obj);
    }

区别在于:

  1. 拿一个盒子
  2. 把东西放进盒子里
  3. 现在拿一个新盒子
  4. 把另一件东西放在新盒子里
  5. 等等

如果想要65个tableObject对象,则需要调用new tableObject(); 65次。否则,您只是在重复使用原始对象。

如果您需要,可以随时询问更多信息。

每次循环时创建tableObject的新副本。

    foreach (XmlNode nodes in root.ChildNodes)
    {
        var obj = new TableDLL.tableObject();
        obj.Value = nodes.InnerText;
        tableVars.Add(nodes.Name, obj);
    }