将嵌套列表作为变量传递不会在父列表中设置值

Passing Nested list as variable does not set the value in parent list

请查看下方代码

public class Page
{
    public string type { get; set; }
    public List<Contains> contains { get; set; }
}

public class Contains
{
    public string type { get; set; }
    public string index {get; set;}
    public List<Contains> contains { get; set; }
}

public class PageMachine
{
    Page Page;
    List<Contains> PageContainer;

    public PageMachine(string type)
    {
        Events = new Dictionary<string, Events>();

        PageContainer = new List<Contains>();

        Page = new Page()
        {
            type = type,
            contains = PageContainer
        };
    }

    public void Add_Container(string rootIndex, string type, string index)
    {

        Contains container = new Contains()
        {
            type = type,
            index = index,
        };

        SetContainer(rootIndex, index, container, Page.contains);  
    }

    private void SetContainer(string rootIndex, string index, Contains newContainer, List<Contains> containers)
    {
        if(containers == null)
        {
            containers = new List<Contains>();
            containers.Add(newContainer);
        }
        else if(containers.Count == 0)
        {
            containers.Add(newContainer);
        }
        else if(!containers.Exists(x => x.index == rootIndex))
        {
            containers.Add(newContainer);
        }
        else
        {
            foreach (var container in containers)
            {
                if (container.index == rootIndex)
                {
                    SetContainer(index, index, newContainer, container.contains);
                }
                else
                {

                }
            }
        }
    }

实施

PageMachine page = new PageMachine("My Page");
page.Add_Container("0", "Parent 1", "0");
page.Add_Container("0", "Child 1 of Perant 1", "0.0");

这背后的想法是为页面创建容器列表,每个容器可以包含更多子容器的列表。 Contains 上的索引 属性 用作映射,父级 0 其子级为 0.0 其子级将为 0.0.0.

我面临的问题是,当调用递归 SetContainer 并在方法中传递 container.contains 时,Page 对象没有反映 List 已更新。

我发现很难解释我的问题,如果有问题我会澄清。

我相信原因在

if(containers == null)
{
    containers = new List<Contains>();
    containers.Add(newContainer);
}

您正在创建一个新的 List,但这并不是您认为的引用所指向的,因为当通过引用传递参数时(如 SetContainer 中的 container.contains),参考是复制

我会试着说明一下。第二次SetContainer被调用(递归),container.contains指向null。

container.contains --> null

此参数通过引用传递给 SetContainer。这意味着引用被复制。这个复制的引用是 SerContainer 中使用的引用,换句话说就是参数 containers.

container.contains --> null
                       ^
                       |
containers ------------+

现在,由于 containers 为空,因此第一个 if 语句为真并创建了一个新的 List,并且容器指向它。

container.contains --> null

containers ----------> newList

添加项目时,它会正确添加到 newList,但 container.contains 并未指向它。这就是为什么当 SetContainer returns 时,什么都没有改变。我希望我已经清楚了。

解决此问题的一种方法是确保在调用 SetContainer 之前创建列表,例如将 for 循环内的 if 语句更改为

if (container.index == rootIndex)
{
    if(container.contains == null)
        container.contains = new List<Contains>();

    SetContainer(index, index, newContainer, container.contains);
}

当然还有从第一个 if 语句中删除 containers = new List<Contains>();。从快速测试来看,它似乎对我有用。

有道理吗?