Напишите выражение linq, чтобы выбрать поддерево элементов - PullRequest
1 голос
/ 06 мая 2009

Учитывая класс:

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

Я бы хотел запрос, чтобы заданный список myControls, который содержит все вышеперечисленные элементы управления со свойствами Parent и Children, установленными как approriate, можно параметризовать с помощью PanelA1 и возвращать TextBoxA1, TextBoxA2, ​​PanelA2, ListBoxA1 и ListBoxA2. Есть ли эффективный способ сделать это с linq? Я выбираю древовидную структуру из базы данных и ищу лучший способ отделить поддеревья, чем рекурсивная функция.

1 Ответ

2 голосов
/ 06 мая 2009

С LINQ трудно сделать это невероятно красиво, поскольку лямбда-выражения не могут быть саморекурсивными, пока они не определены. Рекурсивная функция (возможно, с использованием LINQ) - ваш лучший выбор.

Как бы я это реализовал:

public IEnumerable<Control> ChildrenOf(this IEnumerable<Control> controls)
{
    return controls.SelectMany(c =>
        new Control[] { c }.Concat(ChildrenOf(c.Children)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...