2015-02-11 57 views
0

请查看下面传递嵌套列表作为变量没有设置父列表值

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"); 

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

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

我发现很难解释我的问题,并会澄清是否有问题。

回答

2

我相信原因是

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

你正在创建一个新的List但这不是你想是因为,通过引用传递参数时(如在SetContainercontainer.contains),该参考指出参考复制

我会尽量说明它。第二次调用SetContainer(递归),container.contains指向空。

container.contains --> null 

该参数通过参考SetContainer传递。这意味着参考复制。此复制的参考号是在SerContainer内使用的参考号,换句话说参数containers

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

现在,由于containers为空,第一if说法是正确的,并创建一个新的List和容器指向。

container.contains --> null 

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

当你添加的项目,这是正确添加到newList,但container.contains不指向它。这就是为什么,当SetContainer返回时,没有任何变化。我希望我已经清楚。解决这个问题

的方法之一是确保调用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>();的。从一个快速测试,它似乎为我工作。

有意义吗?

+0

感谢队友,您在回复中非常清楚!非常感激! – 2015-02-11 10:18:28