2017-02-14 5 views
1

Ich bin eine verschachtelte Klasse mit:C# Flatten Objekt verschachtelt

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

    } 

Jetzt möchte ich dies glätten, so kann ich den Namen aller Items und deren childeren bekommen.

Problem hier ist, dass ich nicht weiß, wie viele Ebenen tief geht das.

hatte ich einen Blick auf:

How to flatten nested objects with linq expression

Das ist großartig, wenn Sie wissen, wie viele Ebenen Sie haben, was ich nicht tun.

So:

 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 ... }; 

macht ziemlich genau, was ich brauche, aber ich weiß nicht, wie viele Ebenen tief muss ich gehen, auch wenn ein Artikel nicht über ein Kind es gibt nichts zurück .

Ich würde einige rekursive Routine auf diesem ich denke, aber ich kann nicht scheinen, es zu finden. Ich schaute IEnumerable, aber ich verstehe das noch nicht :)

So jede Hilfe wäre sehr geschätzt.

+0

Schade, dass die Linq Lösung so schrecklich ineffizient ist .. Ich würde empfehlen, es nicht zu benutzen (wie auch Eric Lippert!) –

Antwort

1

Sie richtig sind, müssen Sie Rekursion:

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

Um alle Namen bekommen können Sie das Ergebnis projizieren:

var allDescendantNames = GetAllChildren(item).Select(child => child.Name).ToList();