我有以下课程:
class Person
{
public string Name { get; set; }
public List<Person> Children { get; set; }
}
我创建了这个类的实例,fox ex。
Person pers = new Person();
我可以静态编码foreach循环并将Children存储在某个列表中:
foreach (var item in pers.Children)
{
List<Person> r = item.Children;
foreach (var item2 in item.Children)
{
List<Person> k = item2.Children;
foreach (var item3 in item2.Children)
{
etc..
}
}
}
问题是,如果“ pers ”有一个孩子,如何对foreach循环进行编码,他的一个孩子( pers.Children )也有一个儿童。这就像家谱树一样。
我的意思是,如何让它更动态?因为我不知道这个家庭的结构如何。
编辑: 我只想展示一个人的所有继承人。例如,他的继任者的名字
答案 0 :(得分:2)
使用递归:
public static void ShowAll(Person pers)
{
Console.WriteLine(pers.Name);
foreach (var item in pers.Children)
{
ShowAll(item);
}
}
答案 1 :(得分:1)
您可以这样做的另一种方法是向您的班级添加一个方法,该方法将显示该人的姓名(和/或其他数据),然后显示他们孩子的姓名(和/或其他数据) )通过在每个子实例上调用方法。
这种方法的好处在于它使您的代码更加清晰,并将其留给Person
类来处理它自身的显示方式(以及它的后继者)。
以下是使用此类方法修改过课程的示例:
public class Person
{
public string Name { get; set; }
public List<Person> Children { get; set; }
public Person()
{
Children = new List<Person>();
}
public void DisplaySuccessors(int indendationLevel = 0)
{
Console.WriteLine("{0}{1}", new String('.', indendationLevel * 2), Name);
foreach (var child in Children)
{
child.DisplaySuccessors(indendationLevel + 1);
}
}
}
以下是如何使用它的:
private static void Main()
{
var mother = new Person {Name = "Mother"};
var daughter1 = new Person {Name = "daughter1"};
var granddaughter1 = new Person { Name = "granddaughter1" };
var son1 = new Person { Name = "son1" };
var grandson1 = new Person { Name = "grandson1" };
var granddaughter2 = new Person { Name = "granddaughter2" };
mother.Children.Add(daughter1);
mother.Children.Add(son1);
daughter1.Children.Add(granddaughter1);
son1.Children.Add(grandson1);
son1.Children.Add(granddaughter2);
mother.DisplaySuccessors();
}
输出:
母亲 ..女儿1 ....孙女1 ..son1
....孙子1 ....孙女2
答案 2 :(得分:0)
已经深入讨论了处理树状数据结构: Tree Data Structure
答案 3 :(得分:0)
一种方法是递归,就像这个调用自身的方法一样:
static void WriteAllSuccessors(Person pers, int depth = 0)
{
var indent = new string(' ', depth * 4);
Console.WriteLine(indent + pers.Name);
foreach (var child in pers.Children)
WriteAllSuccessors(child, depth + 1);
}
请注意缩进。
答案 4 :(得分:0)
这是标准递归,您可以调用自身并将节点添加到某个列表中:
static void Main(string[] args)
{
List<Person> successors = new List<Person>();
var person = new Person()
{
Name = "GrandFather",
Children = new List<Person>()
{
new Person()
{
Name = "Son",
Children = new List<Person>()
{
new Person()
{
Name = "SonOfSon"
}
}
},
new Person()
{
Name = "Daughter",
Children = new List<Person>()
{
new Person()
{
Name = "DaughterOfDaughter"
}
}
}
}
};
SearchForSuccessors(person.Children, successors);
}
public static void SearchForSuccessors(List<Person> persons, List<Person> successors)
{
foreach(var person in persons )
{
successors.Add(person);
if (person.Children != null)
SearchForSuccessors(person.Children, successors);
}
}