我正在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
要进行缩进,我需要某种计数器来确定水平嵌套的深度。我一直使用递归方法遇到问题,因为在每次调用时,都会重置变量。我在想,也许我需要使用静态变量来跟踪嵌套级别。我看到的问题是,当它向上移动时,静态变量仍将具有其达到的最深层次的值。
我有点不知道如何进行此操作,尽管我确信这可能是一个简单的解决方案,但我目前无法描述;我通常不使用/不需要递归,因此我没有太多实际使用它的经验。
您提供的任何帮助/建议将不胜感激。
谢谢
我建议一种方法,该方法采用对象并在每个对象之间定义的空间进行打印。每次您深入对象内时,递归调用都会增加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);
}
}