2017-02-14 3 views
1

Я имеющий вложенный класс:C# Свести вложен объект

class Item 
    { 
     public Int32 Id { get; set; } 
     public Int32 Pid { get; set; } 
     public String Name { get; set; } 
     public IEnumerable<Item> Children { get; set; } 

    } 

Теперь я хочу, чтобы сгладить это, так что я могу получить имя всех предметов и их childeren.

Проблема в том, что я не знаю, сколько уровней в глубине этого.

Я посмотрел на:

How to flatten nested objects with linq expression

Это замечательно, если вы знаете, сколько уровней у вас есть, что я не делаю.

Итак:

 var r = from b in items 
       from c in b.Children 
       from d in c.Children 
       ... 
       select new { b.Name, c = c.Name, d = d.Name ... }; 

делает довольно много, что мне нужно, но я не знаю, сколько уровней в глубину, я должен идти, и если один элемент не имеет ребенка она ничего не возвращает ,

Мне понадобится рекурсивная рутина для этого, я думаю, но я не могу найти ее. Я посмотрел на IEnumerable, но я пока этого не понимаю :)

Так что любая помощь будет очень полезна.

+0

Жаль, что решение Linq так ужасно неэффективно .. Я бы рекомендовал не использовать его (как это сделал Эрик Липперт!) –

ответ

1

Вы правы, вам нужна рекурсия:

public IEnumerable<Item> GetAllChildren(Item item) 
{ 
    return item.Children.Concat(item.Children.SelectMany(GetAllChildren)); 
} 

Чтобы получить все имена, которые вы можете проецировать результат:

var allDescendantNames = GetAllChildren(item).Select(child => child.Name).ToList(); 
Смежные вопросы