树上的多个枚举器

时间:2016-06-06 16:43:21

标签: c# enumerator

我有一个树变量。第一个level1有一个level2元素列表。 level2中的每一个都有一个level3元素列表。到第4级。

我需要遍历level4(所有level4,就像level1有一个列表一样),所以我在level1中创建了一个枚举器。它运作良好。但是现在,我需要迭代Level2和level3。我尝试在level1类中创建另外两个枚举器,但是在泛型函数

中出现错误
IEnumerator IEnumerable.GetEnumerator()

我尝试将3 IEnumerable用于level1类。但我读了很多话题,说这不是一件好事。 这些说要使用构图。但是(如果我理解的话),我在level1课程中没有2个列表,但是孩子列表中的子列表... ...

树可以经常更改(level3可以从一个level2更改为另一个level2.用户可以在任何级别添加/删除元素)。因此,我无法轻松地将每个级别元素存储在level1类中。

问题是:做出类似事情的最佳方法是什么

foreach(level2 lvl2 in level1)
{}
foreach(level3 lvl3 in level1)
{}
foreach(level4 lvl4 in level1)
{}

编辑:

树:

level1
  |-> level2 node
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> ...
  |-> level2 node
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> ...
  |-> level2 node
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> level3 node
          |-> level4 node
          |-> level4 node
          |-> level4 node
          |-> ...
     |-> ...
  |-> ...

我的树类

public class TreeLevel1 : IEnumerable
{
    public list<TreeLevel2> treeLevel2 = new list<TreeLevel2>();
    IEnumerator IEnumerable.GetEnumerator()
    {
        return (IEnumerator)GetEnumerator();
    }
    public TreeLevel4Enumerator GetEnumerator()
    {
        return new TreeLevel4Enumerator();
    }
}
public class TreeLevel2
{
    public List<TreeLevel3> treeLevel3 = new List<TreeLevel3>();
}
public class TreeLevel3
{
    public List<TreeLevel4> treeLevel4 = new List<TreeLevel4>();
}
public class TreeLevel4
{
    //some stuff
}

枚举器类执行BFS并仅返回level4。所以我可以这样做:

TreeLevel1 lvl1 = new TreeLevel1();
//populate lvl1.treeLevel2 - with lots of TreeLevel2
//populate lvl1.treeLevel2.treeLevel3 - for each treeLevel2
//populate lvl1.treeLevel2.treeLevel3.treeLevel4 - foreach treeLevel3
foreach(Level4 lvl4 in lvl1)
{
  //do stuff
}

现在我需要遍历lvl1.treeLevel2和lvl1.treeLevel2.treeLevel3。所以我通过添加

在TreeLevel1类中创建了2个枚举器
public TreeLevel2Enumerator GetEnumerator()
{
    return new TreeLevel2Enumerator();
}
public TreeLevel3Enumerator GetEnumerator()
{
    return new TreeLevel3Enumerator();
}

然后使用

foreach(Level2 lvl2 in lvl1)
{
  //do stuff
}
foreach(Level3 lvl3 in lvl1)
{
  //do stuff
}
foreach(Level4 lvl4 in lvl1)
{
  //do stuff
}

但是我在TreeLevel1类

中的泛型枚举器中出错了
IEnumerator IEnumerable.GetEnumerator()
{
    return (IEnumerator)GetEnumerator(); //error here
}

我知道程序无法选择使用哪个枚举器。所以我的问题是:如何创建类似枚举器的函数来迭代每个级别(使用foreach会很棒,但任何其他可能性都可以)

1 个答案:

答案 0 :(得分:0)

好的,我发现了一种非常简单的方法:屈服!

我创建了3个方法

public class TreeLevel1
{
    public IEnumerable<TreeLevel2> TreeLevel2Enumerator()
    {
        for (int i = 0; i < treeLevel2List.Count; i++)
        {
            yield return treeLevel2List[i];
        }
        yield break;
    }
    public IEnumerable<TreeLevel3> TreeLevel3Enumerator()
    {
        for (int i = 0; i < treeLevel2List.Count; i++)
        {
            TreeLevel2 lvl2=treeLevel2List[i];
            for(int j =0; j<lvl2.treeLevel3List.Count; j++)
            { 
                yield return lvl2.treeLevel3List[j];
            }
        }
        yield break;
    }
}

现在我可以做到了

TreeLevel1 lvl1 = new TreeLevel1();
//populate lists
foreach(TreeLevel2 lvl2 in lvl1.TreeLevel2Enumerator())
{
    //do stuff
}
foreach(TreeLevel3 lvl3 in lvl1.TreeLevel3Enumerator())
{
    //do stuff
}