2017-06-01 69 views
1

我想通過一個菜單列舉,但我似乎無法一路下到孩子們。IEnumerator問題

我的模型看起來像這樣。

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) 
{ 

} 

有一個很難解釋我的問題,我想完成

+4

您是否在尋找['yield return'](https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield)? – Cameron

+0

爲什麼不把'MenuEnumerator'作爲'Children.GetEnumerator()'返回的枚舉器的一個包裝?轉發所有電話。 –

+0

你想返回菜單本身+所有的孩子和子女? – Evk

回答

3

如果你只想扁平化層次,並通過整個菜單枚舉,你可以做這樣的:

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

啊完美,我想我試圖讓事情變得複雜 – R4nc1d