1
현재 Tab의 IEnumerable을 TabNodes의 계층 적 컬렉션으로 변환하는 Method 확장 기능이 있습니다.Fluent 인터페이스/확장 방법 - 평면 목록을 탐색 트리로 변환
// 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; }
}
예를 들어, 다음은 당신에게 TABID (32)와 부모 아래에있는 TabNodes의 컬렉션을 줄 것이다 - 깊이의 최대 레벨이 4
IEnumerable<Tab> tabs = GetTabs();
IEnumerable<TabNode> = tabs.AsNavigationHierarchy(32,4);
이 매우 친절 혼란되지 않습니다 더 세분화를 위해. ParentID 대신 특정 Level을 지정하려면 어떻게해야합니까?
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 그 시점에서 나머지 메서드는 실제로 확장 메서드 대신 HierarchyQuery의 멤버가 될 것입니다. –
그게 처음에 생각한거야. 불행히도 내 팀원은 AsNavigationHierarchy() 만 호출 된 경우 IEnumerable을 전체 탐색 구조로 반환 할 것으로 기대합니다. 하지만 사실 그것은 실제로 좋은 생각입니다 ... –
kitsune
예 Chris, 정상적인 건축업자의 일종일 것 같습니다. – kitsune