关于.net:c#flatten嵌套对象

c# flatten nested object

本问题已经有最佳答案,请猛点这里访问。

我有一个嵌套类:

1
2
3
4
5
6
7
8
    class Item
    {
        public Int32 Id { get; set; }
        public Int32 Pid { get; set; }
        public String Name { get; set; }
        public IEnumerable<Item> Children { get; set; }

    }

现在我想把这个展平,这样我可以得到所有物品的名称和他们的孩子。

这里的问题是我不知道这有多深。

我看了一下:

如何用LINQ表达式展平嵌套对象

如果你知道你有多少个等级,这很好,我不知道。

所以:

1
2
3
4
5
        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,但我还不太明白这一点。)

所以任何帮助都是很贴切的。


你是对的,你需要递归:

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

要获取所有名称,可以投影结果:

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