Linq查询嵌套子项n深度c#

时间:2018-07-25 17:11:23

标签: c# linq

试图将同一对象的子项查询到n深度并以以下格式显示。因此,为每个子猫添加标签空间。

Cat 1
   Sub Cat 1 - 1
   Sub Cat 1 - 2
Cat 2
   Sub Cat 2 - 1
   Sub Cat 2 - 2
          Sub Cat 3 - 2 - 2

class NavItem {
    public string label { get; set; }
    public List<NavItem> childItems { get; set; }
}

创建项目

var item = new NavItem()
            {
                label = "Root",
                childItems = new List<NavItem>() {
                    new NavItem() { label = "Cat 1" , childItems = new  List<NavItem>() {
                        new  NavItem() { label = "Sub Cat 1 - 1" },
                        new  NavItem() { label = "Sub Cat 1 - 2" },
                    } },
                    new NavItem() { label = "Cat 2", childItems = new  List<NavItem>() {
                        new  NavItem() { label = "Sub Cat 2 - 1" },
                        new  NavItem() { label = "Sub Cat 2 - 2", childItems = new List<NavItem>() {
                            new NavItem() { label = "Sub Cat 3 - 2 - 2"}
                        } },
                    }  }, 
                }
            };

我有以下代码,该代码不完整。它只能走两个深度

item.childItems.ForEach(i => {
                Console.WriteLine(i.label);
                i.childItems.ForEach(i1 =>
                {
                    Console.WriteLine("\t" + i1.label);
                });
            });

2 个答案:

答案 0 :(得分:1)

我不认为您只能编写LINQ查询来实现所需的功能,因为事先不知道深度,所以您将需要编写遍历树的递归函数。

答案 1 :(得分:1)

是的,如第一个答案所示,这需要递归。

Display(item, 0);

void Display(NavItem item, Int32 tabs)
{
    Console.WriteLine($"{new String('\t', tabs)}{item.label}");
    if (item.childItems != null)
    {
        foreach (var child in item.childItems)
        {
            Display(child, tabs + 1);
        }
    }
}