2009-04-30 3 views
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 
         }; 
      } 
     } 
    } 

답변

2

tabs.AsNavigationHeirachy는 다음 확장 메소드가 기대할 수있는 HerirchyQuery 객체를 반환 할 수 있습니다. 이렇게하면 서로 연결할 수 있습니다.

+0

+1 그 시점에서 나머지 메서드는 실제로 확장 메서드 대신 HierarchyQuery의 멤버가 될 것입니다. –

+0

그게 처음에 생각한거야. 불행히도 내 팀원은 AsNavigationHierarchy() 만 호출 된 경우 IEnumerable 을 전체 탐색 구조로 반환 할 것으로 기대합니다. 하지만 사실 그것은 실제로 좋은 생각입니다 ... – kitsune

+0

예 Chris, 정상적인 건축업자의 일종일 것 같습니다. – kitsune

관련 문제