把我的头缠在IEnumerable和IEnumerator上

时间:2018-08-17 03:18:17

标签: c# ienumerable ienumerator

因此,在长期担任网络管理员之后又回到编码中,并在我学习C#(和Unity)的过程中。试图把我的头缠在IEnumerableIEnumerator

现在,这是我用来测试/配置它的类的示例代码...它可以工作,可以递归地创建树/叶节点,但是我仍然坚持检索它们

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;
     }
 }
}

然后在我使用的其他地方:

foreach(NodeTest nt in tstNode)
{
   Debug.Log(nt.Counter);
}

哪个可以很好地检索顶部节点的子节点,但不遍历子节点来获取其子节点等。我猜想我必须在IEnumerator GetEnumerator方法中做更多的事情?

1 个答案:

答案 0 :(得分:2)

您需要将NodeTest.GetEnumerator设为递归方法。除了返回每个孩子之外,您还需要让每个孩子返回所有孩子。 (这将使每个孩子的孩子返回自己的孩子,等等)。

public IEnumerator GetEnumerator()
{
    foreach(NodeTest n in this.children)
    {
       yield return n;
       foreach(NodeTest descendent in n)
       {
           yield return descendent;
       }
    }
}