C# 获取树层次结构中的最后一项

C# 获取树层次结构中的最后一项,c#,linq,C#,Linq,我有一个支持多层次结构的菜单。我创建了一个函数,用于获取树中的最后一项并返回其id。我需要此id,以便在管理页面上隐藏向下移动箭头 虽然这样做有效,但我花了两天时间试图找到一种LINQ方法来做同样的事情。因此,我的问题是: -是否有可能以纯LINQ的方式实现这一点? -如果是,怎么做 我的MenuItem模型如下所示: public partial class MenuItem { public MenuItem() { this.ChildMenuItems =

我有一个支持多层次结构的菜单。我创建了一个函数,用于获取树中的最后一项并返回其id。我需要此id,以便在管理页面上隐藏向下移动箭头

虽然这样做有效,但我花了两天时间试图找到一种LINQ方法来做同样的事情。因此,我的问题是:

-是否有可能以纯LINQ的方式实现这一点? -如果是,怎么做

我的MenuItem模型如下所示:

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

我将向MenuItem类添加一个函数,用于检查当前MenuItem在父MenuItem的子MenuItem集合中的位置

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));
      }
    }
公共列表展平子节点{
得到{
var ret=新列表();
foreach(ChildMenuItems中的变量项){
重新添加(项目);
如果(item.ChildMenuItems!=null){
ret.AddRange(item.flattedChildNodes);
}
}
返回ret;
}
}  
公立学校{
得到{
if(ParentMenuItem==null)//如果没有父节点(它是根节点),则返回false
返回false;
else//如果我们是父对象的子对象集合中的最后一个子对象,则返回true
return(ParentMenuItem.FlattedChildNodes.ToList().IndexOf(this)==(ParentMenuItem.FlattedChildNodes.ToList().Count-1));
}
}

如果一个级别上的最后一个项目不一定是树中的最后一个项目,这是否支持多个级别的深度?为了清晰起见,我添加了当前的菜单树结构。我也这么认为。我假设如果菜单项是任何级别的最后一个子项,您不希望出现向下箭头?在您的示例中,Admin:1 Parent:n/a、菜单项:6 Parent:2和Manage Ratings:13 Parent:1没有向下箭头。您还必须添加根节点,以便每个显示的节点都有一个父节点(否则,无法判断Admin:1 Parent:n/a是否是一级菜单项集合中的最后一个菜单项。不幸的是,我只希望最下面的项,在上面的示例中,ID 13,隐藏向下箭头。我已经对菜单项在树上上下移动进行了编码,我只需要为无法向下移动的菜单项隐藏箭头或者根节点,我正在为菜单的根节点(称为“menu”)使用另一个类,而不是另一个MenuItem节点。这是出于其他原因(管理多个菜单),我不想改变这一点。我将研究您的建议,但我仍然有兴趣找到一个LINQ语句/查询,以便与我的函数相同。