2017-06-01 2 views
1

Je voudrais énumérer à travers un menu, mais je ne peux pas sembler descendre jusqu'aux enfants.IEnumerator Issue

Mon modèle ressemble à ceci.

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

Ma structure de menu

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

Avec chaque itération je voudrais entrer dans la fonction MoveNext afin que je puisse faire des vérifications de sécurité sur le menuitem, mais je ne peux jamais obtenir les valeurs de l'enfant. Je sais que je peux utiliser linq pour faire cela, mais mon idée est de scinder les contrôles de sécurité pour ne pas polluer mon instruction foreach.

foreach (var menuItem in menu) 
{ 

} 

Avoir du mal à expliquer mon problème et ce que je voudrais accomplir

+4

Vous recherchez ['yield return'] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield)? – Cameron

+0

Pourquoi ne pas simplement faire de 'MenuEnumerator' un wrapper autour de l'énumérateur retourné par' Children.GetEnumerator() '? Transférer tous les appels. –

+0

Vous voulez retourner le menu lui-même + tous les enfants et sous-enfants? – Evk

Répondre

3

Si vous voulez aplatir juste hiérarchie et énumérer tout le menu, vous pouvez le faire comme ceci:

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

Ah parfait, je pense que j'essayais de trop compliquer les choses – R4nc1d