2012-08-06 73 views
2

是否有可能遞歸篩選遞歸樹中的所有項目與linq到對象。遞歸篩選Linq到對象

這是我正在使用的模型。這是由另一個應用程序

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

當用戶登錄到我的申請,我需要覈對菜單項中指定角色的用戶的角色給了我。我知道我可以編寫一個遞歸方法來檢查這個使用for循環。

我反正有沒有得到這個使用像「MenuList.Where(..查看角色)

在此先感謝

+0

所以,你想回到一個新的'Menu'基於具有其子過濾(遞歸)用戶的角色和'Menu'的'角色'? – 2012-08-06 11:44:12

+0

是的,先生,這是要求 – Captain0 2012-08-06 11:46:04

回答

5

我剛剛實現在Menu類的另一種方法:

public class Menu 
{ 
    public string Name { get; set; } 
    public string Roles { get; set; } 
    public List<Menu> Children { get; set; } 
    /// <summary> 
    /// Checks whether this object or any of its children are in the specified role 
    /// </summary>   
    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; 
    } 
} 

然後你可以只寫LINQ查詢:

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

它將遞歸地工作。

1

試試這個擴展方法:

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

而且你可以使用它像這樣:

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