【问题标题】:c# flatten nested object [duplicate]c# 展平嵌套对象
【发布时间】:2017-07-02 15:55:13
【问题描述】:

我有一个嵌套类:

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

    }

现在我想将其展平,以便获得所有项目及其子项的名称。

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

我看过了:

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,但我还不太明白:)

所以任何帮助都会非常感谢。

【问题讨论】:

  • 遗憾的是,Linq 解决方案效率如此之低...我建议不要使用它(就像 Eric Lippert 一样!)

标签: c# .net linq


【解决方案1】:

你是对的,你需要递归:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-10-24
    • 2020-12-22
    • 2021-10-19
    • 2020-06-23
    • 2012-05-29
    • 2017-10-19
    • 2019-04-14
    • 2020-03-02
    相关资源
    最近更新 更多