2017-02-14 128 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,但我真的不明白這一點:)

所以任何幫助將非常appriciated。

+0

可惜,LINQ的解決方案是如此的效率極其低下的..我會建議不要使用它(Eric Lippert也是如此!) –

回答

1

你是對的,你需要遞歸:

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

要獲得所有名稱即可投影結果:

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