我有一个包含
的嵌套列表public class Person
{
public Person(string name)
{
this.Name = name;
}
public string Name { get; set; }
public List<Person> Childs { get; set; }
}
该列表的用法类似于:
var Persons = new List<Person>();
Persons.Add(new Person("Eric"));
Persons[0].Childs = new List<Person>();
Persons[0].Childs.Add(new Person("Tom"));
Persons[0].Childs.Add(new Person("John"));
Persons[0].Childs[0].Childs = new List<Person>();
Persons[0].Childs[0].Childs.Add(new Person("Bill"));
Persons.Add(new Person("John");
如何展平此树(将所有节点和子节点以及子子节点放入列表中),例如我想在同一级别上显示所有的孩子和父母,并带有“参数”级别。这意味着:
之前:
-Eric
-Tom
-John
-Bill
我想要什么:
-Eric, Level1
-Tom, Level2
-John, Level2
-Bill, Level3
答案 0 :(得分:7)
完美的递归方法用例
public static void DisplayPerson(List<Person> persons, int level = 0)
{
if (persons != null)
{
level++;
foreach (Person item in persons)
{
Console.WriteLine("-" + item.Name + ", Level" + level);
DisplayPerson(item.Childs, level);
}
}
}
答案 1 :(得分:1)
Stack
类的完美用例。
public static void DisplayPerson(List<Person> persons)
{
if (persons != null)
{
Stack<Person> personStack = new Stack<Person>();
int level = 1;
persons.ForEach(personStack.Push);
while (personStack.Count > 0)
{
Person item = personStack.Pop();
Console.WriteLine("-" + item.Name + ", Level:" + level);
if (item.Childs != null)
{
item.Childs.ForEach(personStack.Push);
level++;
}
}
}
}
堆栈比C#中的递归方法快得多,并且消耗的内存少得多,并且可以避免有时由recursive C# methods引起的StackOverflows,就像@fubo的答案一样。
答案 2 :(得分:0)
用很短的代码在不更改原始模型的情况下展平一棵树:
static void Main(string[] args)
{
var flattedTree=new List<Person>();
var Persons = new List<Person>();
Persons.Add(new Person("Eric"));
Persons[0].Childs = new List<Person>();
Persons[0].Childs.Add(new Person("Tom"));
Persons[0].Childs.Add(new Person("John"));
Persons[0].Childs[0].Childs = new List<Person>();
Persons[0].Childs[0].Childs.Add(new Person("Bill"));
Persons.Add(new Person("John"));
Flatten(Persons, flattedTree);
//flattedTree variable is the flatted model of tree.
}
static void Flatten(List<Person> nodes, List<Person> flattedNodes)
{
foreach (var node in nodes)
{
flattedNodes.Add(node);
if (node.Childs?.Count > 0)
Flatten(node.Childs, flattedNodes);
}
}