我目前有一个扩展方法,它将类型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; }
}
例如,以下内容将为您提供一个TabNode的集合,这些TabNode位于具有TabId 32的Parent之下 - 最大深度为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
};
}
}
}
答案 0 :(得分:2)
tabs.AsNavigationHeirachy可以返回一个HerirchyQuery对象,您的下一个扩展方法可能会期望该对象。这可以让你把它们连在一起。