自定义对象引用自身,如何阻止它永远循环?

时间:2011-05-12 15:17:03

标签: c# .net

我有一个学校的自定义对象,它是一系列学校的一部分。因此,当我回到学校时,我可以归还与其家庭相关的学校。

然而,当我这样做时,它设法永远循环,我怎么能阻止它。就像只有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 { ; }
    }
}

4 个答案:

答案 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(标记受访节点)建议实际上会更便宜。