LINQ: Как преобразовать вложенный иерархический объект сгладить объект

Как преобразовать вложенный иерархический объект сгладить объекты при помощи LINQ? Я знаю, что мы можем легко использовать цикл foreach для достижения этого. Но я задаюсь вопросом, существует ли способ записать это в LINQ.

class Person{
   public int ID {get;set}
   public string Name {get;set}
   public List<Person> Children {get;}
}

Данные:

ID   : 1

Name : Jack

Children

2 | Rose 

3 | Paul

Мне нравится преобразовывать эти данные в, сглаживают формат как ниже.

1 | Jack 

2 | Rose 

3 | Paul

Как мы можем сделать это с Linq?

14
задан Zhaph - Ben Duguid 26 October 2012 в 18:46
поделиться

1 ответ

Если вы хотите сравнять с землей произвольно глубокое дерево людей, я предлагаю следующее:

public IEnumerable<Person> GetFamily(Person parent)
{
    yield return parent;
    foreach (Person child in parent.Children) // check null if you must
        foreach (Person relative in GetFamily(child))
            yield return relative;
}

Не существует хорошего способа сократить его с помощью LINQ, потому что анонимные ягнята не могут называть себя рекурсивно без реализации Y. Вы могли бы "сократить" вышеприведенный метод до

return parent.Children.SelectMany(p => GetFamily(p))
                      .Concat(new Person[] { parent });

или альтернативно

yield return parent;
    foreach (Person relative in parent.Children.SelectMany(GetFamily))
        yield return relative;

, но это кажется мне ненужным.

.
17
ответ дан 1 December 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: