【问题标题】:dictionary[key] = value is it reference type?dictionary[key] = value 是引用类型吗?
【发布时间】:2016-10-28 07:22:58
【问题描述】:

这里的节点是<string, List<string>>的字典 并且 childnodes 是 List<string> 而 parentnode 是一个字符串。 每当我清除子节点时,节点中所有键的值都会被清除。

    public void processData()
    {
        var hcols = Input.Columns.Take(Input.Columns.Count).ToList();
        var childNodes = new List<string>();
        var parentNode = "Default";

        for (var i= 1 ; i < hcols.Count -1 ; i++)
        {
            var splitString = hcols[i].Name.Split('_');

            if (nodes.ContainsKey(splitString[0]))
            {
                childNodes.Add(splitString[1]);
            }

            else
            {
                var childNodes2 = childNodes;
                if (!nodes.ContainsKey(splitString[0]) && childNodes.Count > 0)
                {
                    nodes[parentNode] = childNodes2;
                }
                nodes.Add(splitString[0], null);
                parentNode = splitString[0];
                childNodes.Clear();
                if (splitString.Length > 1) childNodes.Add(splitString[1]);
            }
            Array.Clear(splitString, 0, splitString.Length);
        }
        nodes[parentNode] = childNodes;
    }

【问题讨论】:

  • 你的问题是什么?
  • 你只能创建一个List&lt;string&gt;。这个对象是一个引用类型。正在为每个键添加相同的列表。您需要为每个键创建一个单独的列表,否则您将获得您所描述的行为。

标签: c# dictionary data-structures


【解决方案1】:

您对所有键使用相同的列表引用。与其清除列表,不如创建一个新列表:

public void processData()
{
    var hcols = Input.Columns.Take(Input.Columns.Count).ToList();
    var childNodes = new List<string>();
    var parentNode = "Default";

    for (var i= 1 ; i < hcols.Count -1 ; i++)
    {
        var splitString = hcols[i].Name.Split('_');

        if (nodes.ContainsKey(splitString[0]))
        {
            childNodes.Add(splitString[1]);
        }

        else
        {
            var childNodes2 = new List<string>(childNodes); // depending on your case, you may want a copy here too
            if (!nodes.ContainsKey(splitString[0]) && childNodes.Count > 0)
            {
                nodes[parentNode] = childNodes2;
            }
            nodes.Add(splitString[0], null);
            parentNode = splitString[0];
            childNodes = new List<string>(); // instead of clear 
            if (splitString.Length > 1) childNodes.Add(splitString[1]);
        }
        Array.Clear(splitString, 0, splitString.Length);
    }
    nodes[parentNode] = childNodes;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    相关资源
    最近更新 更多