Напишите выражение linq для выбора поддерева элементов
Вопрос
Задан класс:
class Control
{
public Control Parent { get; set; }
public List<Control> Children { get; set; }
}
и список:
List<Control> myControls;
Можно ли написать запрос linq, который выберет всех детей и внуков для данного элемента управления?Например, если дерево выглядит следующим образом:
GridA1
PanelA1
TextBoxA1
TextBoxA2
PanelA2
ListBoxA1
ListBoxA2
GridB1
PanelB1
TextBoxB1
Я бы хотел, чтобы запрос, заданный list 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)));
}