質問

クラスを指定:

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)));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top