2017-02-14 12 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を見ましたが、私はまだこれを理解していません:)

だから、どんな助けも非常に上手くいくでしょう。あなたは結果を投影できるすべての名前を取得するには

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

+0

LINQのソリューションは、とても恐ろしく非効率的であることを恥を...私はそれを使用することをお勧めします(Eric Lippertのように!) –

答えて

1

あなたは正しいです、あなたは再帰を必要とする

var allDescendantNames = GetAllChildren(item).Select(child => child.Name).ToList(); 
関連する問題