有没有办法让字典存储价值而不是指向价值?

时间:2013-02-21 15:44:30

标签: c# dictionary

所以我有一本字典:

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)?我是否必须为每个TableDLL.tableObject条目制作一个新的Dictionary

5 个答案:

答案 0 :(得分:3)

obj的创建移动到循环中:

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

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

答案 1 :(得分:3)

您只创建一个对象并使用最后一个节点不断更新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);
    }

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

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

基本上,你所做的是:

  1. 拿一个盒子。
  2. 把东西放在盒子里。
  3. 现在用另一件东西取而代之。
  4. 您尚未创建新容器,只是更改了现有容器的内容。

    这样做:

        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. 等...
    6. 如果您想要65个tableObject个对象,则需要拨打new tableObject(); 65次。否则你只是重复使用原始对象。

      如果您需要,请随时提出更多信息。

答案 4 :(得分:1)

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

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