我有一个学校的自定义对象,它是一系列学校的一部分。因此,当我回到学校时,我可以归还与其家庭相关的学校。
然而,当我这样做时,它设法永远循环,我怎么能阻止它。就像只有1级深度而不是递归?
public class School
{
public long BaseId { get; set; }
public string BaseName { get; set; }
public string SchoolFamily { get; set; }
public List<School> LinkedSchools
{
get
{
var schoolRepository = new SchoolRepository();
return schoolRepository.GetAllSchoolsLinkedByFamily(SchoolFamily).ToList();
}
set { ; }
}
}
答案 0 :(得分:1)
添加一个布尔成员变量作为标志,默认清除。在get函数中要做的第一件事就是检查那个标志。如果已设置,则返回空列表。否则设置标志,创建列表,清除标志,然后返回列表。
答案 1 :(得分:1)
您可以将学校的当前实例(this)传递到GetAllSchoolsLinkedByFamily
,当到达实例时,您可以停止。
答案 2 :(得分:0)
将LinkedSchools
属性更改为接受nestLevel
的可选整数参数的方法。像这样:
public List<School> GetLinkedSchools(int nestLevel)
{
// Get schools logic here...
}
然后更改您的代码,以便每个递归级别递增一个计数器,并在计数器等于nestLevel
时返回。
答案 3 :(得分:0)
我建议首先将当前学校添加到返回Collection并通过每次递归迭代传递该Collection。然后,在迭代方法内部,仅为尚未在列表中的学校添加/执行更深的迭代。通过这种方式,您可以获得所有相关的学校,但没有无休止的递归。
修改:如果您不介意装饰您的班级,下面的Mark Jones Graph Traversal(标记受访节点)建议实际上会更便宜。