I'm having a nested class :
class Item
{
public Int32 Id { get; set; }
public Int32 Pid { get; set; }
public String Name { get; set; }
public IEnumerable<Item> Children { get; set; }
}
Now I want to flatten this so I can get the name of all Items and their childeren.
Problem here is that I don't know how many levels deep this goes.
I had a look at :
How to flatten nested objects with linq expression
This is great if you know how many levels you have, which I don't.
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 ... };
does pretty much what I need, but I don't know how many levels deep I need to go, also if one item does not have a child it doesn't return anything.
I would need some recursive routine on this I guess, but I can't seem to find it. I looked at IEnumerable but I don't really understand this yet :)
So any help would be very much appriciated.
You are right, you need recursion:
public IEnumerable<Item> GetAllChildren(Item item)
{
return item.Children.Concat(item.Children.SelectMany(GetAllChildren));
}
To get all names you can project the result:
var allDescendantNames = GetAllChildren(item).Select(child => child.Name).ToList();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With