C# 将我的头绕在IEnumerable&;迭代器
因此,在网络管理员长时间中断后重新开始编码。。。我一边学习C#(和统一)。试着把我的头绕在C# 将我的头绕在IEnumerable&;迭代器,c#,ienumerable,ienumerator,C#,Ienumerable,Ienumerator,因此,在网络管理员长时间中断后重新开始编码。。。我一边学习C#(和统一)。试着把我的头绕在IEnumerable和IEnumerator 现在,这里是我用来测试/计算它的类的示例代码。。。它可以工作,递归地创建树/叶节点,但是我一直在检索它们 public class NodeTest : IEnumerable { public int Counter; public List<NodeTest> children; public NodeTest(int co
IEnumerable
和IEnumerator
现在,这里是我用来测试/计算它的类的示例代码。。。它可以工作,递归地创建树/叶节点,但是我一直在检索它们
public class NodeTest : IEnumerable
{
public int Counter;
public List<NodeTest> children;
public NodeTest(int count)
{
Counter = count;
Debug.Log("Creating " + count);
NodeTest tmpNode;
if(count>1)
{
children = new List<NodeTest>();
tmpNode = new NodeTest(Counter - 1);
children.Add(tmpNode);
tmpNode = new NodeTest(Counter - 1);
children.Add(tmpNode);
}
}
public IEnumerator GetEnumerator()
{
foreach(NodeTest n in this.children)
{
yield return n;
}
}
}
它可以很好地检索顶级节点的子节点,但不会遍历子节点以获取其子节点等。我猜我必须在
IEnumerator
GetEnumerator
方法中做更多的工作 您需要使NodeTest.GetEnumerator
成为递归方法。除了返回每个孩子,您还需要让每个孩子返回其所有孩子。(这将使每个孩子的孩子返回其孩子等)
您需要使
NodeTest.GetEnumerator
成为递归方法。除了返回每个孩子,您还需要让每个孩子返回其所有孩子。(这将使每个孩子的孩子返回其孩子等)
比我快。请注意,这将返回子代之前的父代-根据业务需求,您可以移动
yield return n代码>在内部的foreach
下面。哦,天哪,为什么我没有想到。。。感谢Andrew和CominternIt,应该指出这段代码是正确的,但是应该避免使用递归收益率返回,因为它们会变得非常低效。如果你递归20级,这意味着每个项目必须通过20级收益率返回到原始foreach,然后通过20级返回到下一个项目。虽然如果你只递归几层,这应该没什么大不了的。是的,最多5-9层。。。BSP树。Andrew的代码给了我一个错误,因为在检查我是否达到递归的极限之前,我有了children=new列表。请注意,这将返回子代之前的父代-根据业务需求,您可以移动yield return n代码>在内部的foreach
下面。哦,天哪,为什么我没有想到。。。感谢Andrew和CominternIt,应该指出这段代码是正确的,但是应该避免使用递归收益率返回,因为它们会变得非常低效。如果你递归20级,这意味着每个项目必须通过20级收益率返回到原始foreach,然后通过20级返回到下一个项目。虽然如果你只递归几层,这应该没什么大不了的。是的,最多5-9层。。。BSP树。Andrew的代码给我带来了一个错误,因为在检查我是否达到递归的极限之前,我有了children=new List。如果您的所有项都来自NodeTest类型,那么为什么选择使用更具体、更易于使用的IEnumerable接口IEnumerable,它还允许您轻松地使用LINQ和结果。如果您的项目来自类型NodeTest为什么选择使用更具体、更易于使用的IEnumerable接口IEnumerable,这也允许您在结果中轻松使用LINQ。
foreach(NodeTest nt in tstNode)
{
Debug.Log(nt.Counter);
}
public IEnumerator GetEnumerator()
{
foreach(NodeTest n in this.children)
{
yield return n;
foreach(NodeTest descendent in n)
{
yield return descendent;
}
}
}