代码之家  ›  专栏  ›  技术社区  ›  kitsune

流畅的界面/扩展方法-将平面列表转换为导航树

  •  1
  • kitsune  · 技术社区  · 16 年前

    我目前有一个扩展方法,可以将Tab类型的IEnumerable转换为TabNodes的分层集合。

    // If Tab has no parent its ParentId is -1
    
    public class Tab
    {
    public int TabId { get; set; }
        public string TabName { get; set; }
        public int Level { get; set; }
        public int ParentId { get; set; }
    
    }
    
    public class TabNode
    {
        public TabInfo Tab { get; set; }
        public IEnumerable<TabNode> ChildNodes { get; set; }
        public int Depth { get; set; }
    }
    

    例如,下面将为您提供一个TabNodes集合,这些TabNodes位于TabId为32的父节点之下-最大深度级别为4。

    IEnumerable<Tab> tabs = GetTabs();
    
    IEnumerable<TabNode> = tabs.AsNavigationHierarchy(32,4);
    

    这是令人困惑的,对于进一步的改进来说不是很友好。如果我想指定某个级别而不是ParentID,该怎么办?

    我想做的是这样的:

    IEnumerable<TabNode> = tabs.AsNavigationHierarchy().WithStartLevel(2).WithMaxDepth(5)
    

    我被困在如何优雅地做到这一点上。你能帮助我吗?

    这是我当前的函数,由我的扩展方法调用(基于我在上找到的一篇文章) www.scip.be ).

        private static IEnumerable<TabNode>
          CreateHierarchy(
            IEnumerable<TabInfo> tabs,
            int startTabId,
            int maxDepth,
            int depth)
        {
            IEnumerable<TabInfo> children;
    
    
                children = tabs.Where(i => i.ParentId.Equals(startTabId));
    
    
            if (children.Count() > 0)
            {
                depth++;
    
                if ((depth <= maxDepth) || (maxDepth == 0))
                {
                    foreach (var childTab in children)
                        yield return
                          new TabNode()
                          {
                              Tab = childTab,
                              ChildNodes =
                                CreateHierarchy(tabs, childTab.TabID, maxDepth, depth),
                              Depth = depth
                          };
                }
            }
        }
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   JoshBerke    16 年前

    tabs.AsNavigationHeirachy可以返回下一个扩展方法所期望的HerirchyQuery对象。这会让你把它们锁在一起。