1

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

// 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,它们位于 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
                      };
            }
        }
    }
4

1 回答 1

2

tabs.AsNavigationHeirachy 可以返回一个 HerirchyQuery 对象,您的下一个扩展方法将期望该对象。这将使您可以将它们链接在一起。

于 2009-04-30T15:23:20.837 回答