将嵌套列表作为变量传递不会在父列表中设置值
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>();
。从快速测试来看,它似乎对我有用。
有道理吗?
请查看下方代码
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>();
。从快速测试来看,它似乎对我有用。
有道理吗?