Свободные интерфейсы/методы расширения. Превращение плоского списка в дерево навигации.
-
03-07-2019 - |
Вопрос
В настоящее время у меня есть метод расширения, который преобразует IEnumerable типа Tab в иерархическую коллекцию 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, которые находятся ниже родительского элемента с 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
};
}
}
}
Решение
tabs.AsNavigationHeirachy может вернуть объект HerirchyQuery, который затем будут ожидать ваши следующие методы расширения.Это позволит вам связать их вместе.