Напишите выражение linq для выбора поддерева элементов

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Задан класс:

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)));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top