C# 将我的头绕在IEnumerable&;迭代器

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

因此,在网络管理员长时间中断后重新开始编码。。。我一边学习C#(和统一)。试着把我的头绕在
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;
       }
    }
}