2014-11-04 29 views
0

我有一個菜單支持多層次的層次結構。我創建了一個函數,讓我獲得樹中的最後一項並返回它的ID。我需要這個ID,這樣我可以在管理頁面上隱藏向下箭頭。在樹形結構中獲取最後一項

雖然這個工作,我花了2天試圖找到一個LINQ做同樣的事情的方式。所以我的問題是:

- 是否有可能以純LINQ方式做到這一點? - 如果是這樣,怎麼樣?

我的菜單項的模型是這樣的:

public partial class MenuItem 
{ 
    public MenuItem() 
    { 
     this.ChildMenuItems = new HashSet<MenuItem>(); 
    } 

    public int Id { get; set; } 
    public int MenuItemTypeId { get; set; } 
    public int MenuId { get; set; } 
    public string DisplayText { get; set; } 
    public string Controller { get; set; } 
    public string Action { get; set; } 
    public Nullable<int> ParentMenuItemId { get; set; } 
    public int Rank { get; set; } 

    public virtual MenuItemType MenuItemType { get; set; } 
    public virtual Menu Menu { get; set; } 
    public virtual ICollection<MenuItem> ChildMenuItems { get; set; } 
    public virtual MenuItem ParentMenuItem { get; set; } 
} 

和我的遞歸函數如下:

public static int GetLastMenuItemId(List<MenuItem> menuItems) 
{ 
    foreach (MenuItem menuItem in menuItems.OrderBy(mi => mi.Rank)) 
    {     
     lastId = menuItem.Id; 
     if (menuItem.ChildMenuItems.Any()) 
     { 
      GetLastMenuItemId(menuItem.ChildMenuItems.ToList()); 
     } 
    } 
    return lastId; 
} 

此外,我的菜單樹目前看起來是這樣的:

Categories: 8 Parent: n/a 
Admin: 1 Parent: n/a 
    Manage Menus: 2 Parent: 1 
     Manage Menus: 7 Parent: 2 
     ------------: 5 Parent: 2 
     Menus: 3 Parent: 2 
     Menu Item Types: 4 Parent: 2 
     Menu Items: 6 Parent: 2 
    Manage Categories: 9 Parent: 1 
    Manage Clicks: 10 Parent: 1 
    Manage Comments: 11 Parent: 1 
    Manage Images: 12 Parent: 1 
    Manage Ratings: 13 Parent: 1 

回答

0

我想添加一個函數到你的MenuItem類中,該函數檢查當前MenuItem在父項MenuItem的子項MenuItems。

public List<MenuItem> FlattenedChildNodes { 
    get { 
    var ret = new List<MenuItem>(); 

    foreach (var item in ChildMenuItems) { 
     ret.Add(item); 

     if(item.ChildMenuItems != null) { 
      ret.AddRange(item.FlattenedChildNodes); 
     } 
    } 

    return ret; 
    } 
} 



public bool IsLastChild { 
     get { 
     if (ParentMenuItem == null) // return false if we have no parent (it's the root node) 
      return false; 
     else // return true iff we're the last child in the parent's collection of children 
      return (ParentMenuItem.FlattenedChildNodes.ToList().IndexOf(this) == (ParentMenuItem.FlattenedChildNodes.ToList().Count - 1)); 
     } 
    } 
+0

這個支持是多層次深層次的最後一個項目不一定是樹中的最後一個項目?爲了清楚起見,我添加了當前的菜單樹結構。 – 2014-11-04 20:22:17

+0

我會這麼認爲。如果MenuItem是任何級別的最後一個孩子,我假設你不想要向下箭頭出現?在您的示例中,管理員:1父母:不適用,菜單項:6父母:2,管理評分:13父母:1不會有向下箭頭。 – 2014-11-04 20:23:33

+0

您還必須添加一個根節點,以便每個顯示的節點都有一個父節點(否則無法確定Admin:1 Parent:n/a是MenuItems的第1級集合中的最後一個MenuItem) – 2014-11-04 20:24:10