2009-04-30 12 views
1

私は現在、タイプ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; } 
} 

、次はあなたのTabId 32と親の下にあるTabNodesのコレクションを与えるだろう - 深さの最大レベルは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 
         }; 
      } 
     } 
    } 

答えて

2

tabs.AsNavigationHeirachyは、次の拡張メソッドが期待するHerirchyQueryオブジェクトを返すことができます。これにより、それらを連鎖させることができます。

+0

+1しかし、その時点では、残りのメソッドはおそらく実際は拡張メソッドの代わりにHierarchyQueryのメンバーになるでしょう。 –

+0

これは私が最初に考えたことです。残念ながら、私のチームメイトは、AsNavigationHierarchy()だけが呼び出された場合、ナビゲーション構造全体でIEnumerable を返すと期待していました。しかし実際にはそれは確かに良いアイデアです... – kitsune

+0

はいクリス、それは普通のビルダーのいくつかの種類になると思います – kitsune

関連する問題