質問
クラスを指定:
class Control
{
public Control Parent { get; set; }
public List<Control> Children { get; set; }
}
およびリスト:
List<Control> myControls;
すべての子を選択するlinqクエリを記述することはできます&amp;特定のコントロールの孫?たとえば、ツリーが次のようになっている場合:
GridA1
PanelA1
TextBoxA1
TextBoxA2
PanelA2
ListBoxA1
ListBoxA2
GridB1
PanelB1
TextBoxB1
親と子のプロパティが適切に設定された上記のすべてのコントロールを含むリストmyControlsが与えられ、PanelA1でパラメーター化され、TextBoxA1、TextBoxA2、PanelA2、ListBoxA1およびListBoxA2を返すクエリが必要です。 linqでこれを行う効率的な方法はありますか?データベースからツリー構造を選択し、再帰関数よりもサブツリーを引き離すより良い方法を探しています。
解決
ラムダ式は定義されるまで自己再帰的ではないため、これをLINQで非常にきれいな方法で行うことは困難です。再帰関数(おそらくLINQを使用)が最善の策です。
実装方法:
public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls)
{
return controls.SelectMany(c =>
new Control[] { c }.Concat(ChildrenOf(c.Children)));
}
所属していません StackOverflow