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
};
}
}
}
+1しかし、その時点では、残りのメソッドはおそらく実際は拡張メソッドの代わりにHierarchyQueryのメンバーになるでしょう。 –
これは私が最初に考えたことです。残念ながら、私のチームメイトは、AsNavigationHierarchy()だけが呼び出された場合、ナビゲーション構造全体でIEnumerableを返すと期待していました。しかし実際にはそれは確かに良いアイデアです... –
kitsune
はいクリス、それは普通のビルダーのいくつかの種類になると思います – kitsune