Filtraggio ricorsivo Linq To Objects

è ansible filtrare ricorsivamente tutti gli elementi nell’albero ricorsivo con linq agli oggetti.

Questo è il modello che sto usando. Questo mi è stato dato da un’altra applicazione

public class Menu { public string Name{get;set;} public string Roles{get;set;} public List Children{get;set;} } 

Quando l’utente accede alla mia applicazione ho bisogno di controllare i ruoli degli utenti rispetto ai ruoli specificati in per la voce di menu. So che posso scrivere un metodo ricorsivo che controlli questo usando un ciclo for.

Ci sono comunque per usare questo come ‘MenuList.Where (.. controlla i ruoli)

Grazie in anticipo

Vorrei solo implementare un altro metodo nella class Menu :

 public class Menu { public string Name { get; set; } public string Roles { get; set; } public List Children { get; set; } ///  /// Checks whether this object or any of its children are in the specified role ///  public bool InRole(string role) { if (role == null) { throw new ArgumentNullException("role"); } var inRole = (this.Roles ?? String.Empty).Contains(role); if (!inRole & Children != null) { return Children.Any(child => child.InRole(role)); } return inRole; } } 

E poi puoi semplicemente scrivere query LINQ come:

 var inRole = menuList.Where(menu => menu.InRole("admin")); 

Funzionerà in modo ricorsivo.

Prova questo metodo di estensione:

 public static IEnumerable Flatten(this IEnumerable source, Func recursion) where R : IEnumerable { return source.SelectMany(x => (recursion(x) != null && recursion(x).Any()) ? recursion(x).Flatten(recursion) : null) .Where(x => x != null); } 

E puoi usarlo in questo modo:

 menu.Flatten(x => x.Children).Where(x => x.Roles.Contains(role));