在对象树中查找对象

时间:2014-02-14 08:31:21

标签: c# windows recursion tree

你好,我有一个下一个对象:

public class Industry
{
    public int? id { get; set; }
    public int? parentId { get; set; }
    public string name { get; set; }
    public List<Industry> industryList { get; set; }
}

因此它用于创建分层对象,它可以有任何级别。

我需要创建一个函数,在这个树中找到一个给定id的对象。

到目前为止我写过:

//IndustryList - is a fully created hirerchical object, the Root List of industries
//id - is a id of industry that i wish to find.
private Industry GetIndustryById(List<Industry> IndustryList, int? id)
    {
        if (id != null)
        {
            foreach (Industry industry in IndustryList)
            {
                if (industry.id == id)
                {
                    return industry;
                }
            }
            foreach (Industry industry in IndustryList)
            {
                if (industry.industryList != null)
                {
                    return GetIndustryById(industry.industryList, id);
                }
            }
        }
        return null;
    }

问题是这个代码完美无缺,因为在某些项目上它返回null - 这是不可能的,因为如果我看到并且可以按下这个项目那么它就存在了。我发现我的代码到达了

return null;

这也不正确,因为id有一个值!

我的错误在哪里?

此外:

当我第一次调用函数GetIndustryById(List IndustryList,int?id)时,IndustryList - 是一个非空的静态全局对象。 然后递归开始遍历此全局对象中的所有List,以查找具有请求id的Industry。

这个if,只检查我是否给出了正确的参数,但ID总是相同的     if(id!= null)     {     }

1 个答案:

答案 0 :(得分:5)

我认为这就是答案:

private Industry GetIndustryById(List<Industry> IndustryList, int? id)
{
    if (id != null)
    {
        foreach (Industry industry in IndustryList)
        {
            if (industry.id == id)
            {
                return industry;
            }
        }
        foreach (Industry industry in IndustryList)
        {
            if (industry.industryList != null)
            {
                // Here was your mistake. If you return GetIndustryById()
                // without checking for null first, you will return null
                // if that subtree doesn't contain the target, even if
                // a subsequent subtree does.

                var result = GetIndustryById(industry.industryList, id);

                if (result != null)
                    return result;
            }
        }
    }
    return null;
}