遍历嵌套列表对象

问题描述 投票:0回答:1

我正在C#中的项目中工作,我有一个带有属性的对象,其中一个称为Children,与父对象相同。例如:

public class ObjectInformation
{
   public string FullName {get; set;}
   public string FriendlyName {get; set;}
   public List<ObjectInformation> Children {get;}
}

而且我已经有了将根对象展平为简单列表的方法:

public static IEnumerable<ObjectInformation> Flatten(List<ObjectInformation> objs)
{
   var localCopy = Helpers.General.DeepCopy(objs);
   var finalList = new List<ObjectInformation>();
   foreach(var obj in localCopy)
   {
      if(obj.Children.Count > 0)
      {
         finalList.AddRange(Flatten(obj.Children));
         obj.Children.Clear();
      }

      obj.Parent = null;
      finalList.Add(obj);
   }

   return finalList;
}

我知道上述方法可能会得到改进,但是现在可以使用。但是,我现在要做的是遍历嵌套列表并输出数据,同时根据嵌套级别缩进行。

因此,举例来说,假设根对象有两个对象,第一个对象有一个孩子,第二个对象有一个孩子,后者也有一个孩子。我希望输出是这样的:

FullName of Root Object 1
   FullName of Child 1 of Root Object 1
FullName of Root Object 2
   FullName of Child 1 of Root Object 2
      FullName of Child 1 of Child 1 of Root Object 2

要进行缩进,我需要某种计数器来确定水平嵌套的深度。我一直使用递归方法遇到问题,因为在每次调用时,都会重置变量。我在想,也许我需要使用静态变量来跟踪嵌套级别。我看到的问题是,当它向上移动时,静态变量仍将具有其达到的最深层次的值。

我有点不知道如何进行此操作,尽管我确信这可能是一个简单的解决方案,但我目前无法描述;我通常不使用/不需要递归,因此我没有太多实际使用它的经验。

您提供的任何帮助/建议将不胜感激。

谢谢

c# recursion formatting nested-lists
1个回答
0
投票

我建议一种方法,该方法采用对象并在每个对象之间定义的空间进行打印。每次您深入对象内时,递归调用都会增加x个空间。

    public static void Print(this ObjectInformation parent, int spacing = 2)
    {
        Console.WriteLine($"{new string(' ', spacing)}{parent.FullName}");
        foreach (ObjectInformation child in parent.Children)
        {
            child.Print(spacing + 2);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.