我想列举一份菜单,但我似乎无法一直到孩子们面前。
我的模型看起来像这样。
public class Menu : IEnumerable<Menu>
{
public new IEnumerable<Menu> Children { get; set; }
public IEnumerator<Menu> GetEnumerator()
{
return new MenuEnumerator(this);
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MenuEnumerator : IEnumerator<Menu>
{
private readonly Menu _menu;
public MenuEnumerator(Menu menu)
{
_menu = menu;
}
public bool MoveNext()
{
if (this.Current == null)
{
this.Current = this._menu;
}
return true;
}
public void Reset()
{
}
public Menu Current { get; set; }
object IEnumerator.Current => Current;
public void Dispose()
{
this.Current = null;
}
}我的菜单结构
public static IEnumerable<Menu> GetMenuStructure()
{
return new Menu
{
Children = new List<Menu>
{
new Menu
{
PkLinkId = 2,
FkParentLinkId = null,
Target = "_self",
Text = "Company",
Children = new List<Menu>()
{
new Menu()
{
PkLinkId = 4,
FkParentLinkId = 2,
Target = "_self",
Text = "Add A New Company",
},
new Menu()
{
PkLinkId = 27,
FkParentLinkId = 2,
Target = "_self",
Text = "Basic Company Information",
},
}
},
new Menu()
{
PkLinkId = 5,
FkParentLinkId = null,
Target = "_self",
Text = "Bureau",
Children = new List<Menu>()
{
new Menu()
{
PkLinkId = 31,
FkParentLinkId = 5,
Target = "_self",
Text = "Admin",
},
new Menu()
{
PkLinkId = 76,
FkParentLinkId = 5,
Target = "_self",
},
}
}
}
};
}每次迭代时,我都想进入MoveNext函数,这样我就可以对menuitem进行一些安全检查,但是我永远无法获得子值。
我知道我可以使用linq来完成这个任务,但是我的想法是将安全代码检查分开,这样我就不会污染我的foreach语句。
foreach (var menuItem in menu)
{
}很难解释我的问题和我想做什么
发布于 2017-06-01 19:15:46
如果您只想夷平层次结构并在整个菜单中进行枚举,您可以这样做:
public IEnumerator<Menu> GetEnumerator()
{
// first return self
yield return this;
if (Children != null) {
foreach (var child in Children) {
// recursively call this same function of each child
foreach (var subChild in child) {
yield return subChild;
}
}
}
}https://stackoverflow.com/questions/44315195
复制相似问题