我有一个树变量。第一个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会很棒,但任何其他可能性都可以)
答案 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
}