interfaces / métodos de extensão fluentes - girando uma lista simples em uma árvore de navegação
-
03-07-2019 - |
Pergunta
Eu tenho atualmente uma extensão Método que converte um IEnumerable do tipo Tab em uma coleção hierárquica de 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; }
}
Por exemplo, o seguinte iria dar-lhe uma coleção de TabNodes que estão abaixo de um pai com tabid. 32 - o nível máximo de profundidade é 4
IEnumerable<Tab> tabs = GetTabs();
IEnumerable<TabNode> = tabs.AsNavigationHierarchy(32,4);
Esta é confuso e não muito amigável para maior refinamento. E se eu gostaria de especificar um certo nível em vez de um ParentID?
O que eu gostaria de fazer é algo como isto:
IEnumerable<TabNode> = tabs.AsNavigationHierarchy().WithStartLevel(2).WithMaxDepth(5)
Eu estou preso como a forma de fazer isso com elegância. Pode me ajudar?
Esta é a minha função atual que é chamado pelos meus métodos de extensão (com base em um artigo que eu encontrei em 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
};
}
}
}
Solução
tabs.AsNavigationHeirachy poderia retornar um objeto HerirchyQuery que seus métodos próxima extensão, então, esperar. Isso permitirá que você encadear-los juntos.