Schreiben einer linq-Ausdruck zu wählen Sie eine Teilstruktur der Elemente

StackOverflow https://stackoverflow.com/questions/830935

  •  06-07-2019
  •  | 
  •  

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.

War es hilfreich?

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)));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top