Schreiben einer linq-Ausdruck zu wählen Sie eine Teilstruktur der Elemente
Frage
Gegeben eine Klasse:
class Control
{
public Control Parent { get; set; }
public List<Control> Children { get; set; }
}
und die Liste:
List<Control> myControls;
Ist es möglich zu schreiben, eine linq-Abfrage, wählen alle Kinder und Enkelkinder für ein bestimmtes Steuerelement?Zum Beispiel, wenn ein Baum sieht wie folgt aus:
GridA1
PanelA1
TextBoxA1
TextBoxA2
PanelA2
ListBoxA1
ListBoxA2
GridB1
PanelB1
TextBoxB1
Ich möchte eine Abfrage, die angesichts Liste myControls enthält alle oben genannten Steuerungen mit Übergeordneten und untergeordneten Eigenschaften festgelegt entsprechenden parametriert werden, mit PanelA1 und Rückgabe TextBoxA1, TextBoxA2, PanelA2, ListBoxA1 und ListBoxA2.Gibt es eine effiziente Möglichkeit, dies zu tun mit linq?Ich bin auswählen ein Baum-Struktur aus einer Datenbank und suchen nach einem besseren Weg, um pull-apart-Teilbäume als eine rekursive Funktion.
Lösung
Es ist schwer zu tun, dies in einer ungemein hübschen Weg mit LINQ, da lambda-Ausdrücke können sich nicht selbst-rekursiven, bevor Sie definiert worden sind.Eine rekursive Funktion (vielleicht mithilfe von LINQ) ist Ihre beste Wette.
Wie würde ich es implementieren:
public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls)
{
return controls.SelectMany(c =>
new Control[] { c }.Concat(ChildrenOf(c.Children)));
}