我设置了这种情况:
具有属性" Children"的对象,它是相同类型的List。结构的深度是未知的。这就是对象的样子:
public class CustomType
{
public Guid ID { get; set; }
public string Name { get; set; }
public List<CustomType> Children { get; set; }
}
现在我想搜索一个特定的名称,如果我找到了一个与此名称匹配的元素,我想知道它的根元素。例如:
我已经有了FoundElement,但我想知道它的顶级父元素。我希望我的问题是可以理解的。主要问题是对象中不存在的父链接......
这么久 克里斯
答案 0 :(得分:1)
正如你所说,理想的是在课堂上拥有Parent
属性。但是,如果要求不具备该功能,则应该检查所有候选根节点的所有后代。这可以递归地完成,如:
private bool HasDescendent(CustomType parent, CustomType descendent)
{
if(parent.Children.Contains(descendent))
return true;
return parent.Children.Any(child => HasDescendent(child, descendent);
}
private CustomType FindRoot(IEnumerable<CustomType> candidateRoots, CustomType node)
{
return candidateRoots.First(root => HasDescendent(root, node));
}
答案 1 :(得分:0)
实现这一目标的唯一方法就是递归(我暂时没有完成C#,所以这里有一些伪代码):
list<items> findPath(root, needle):
if root == needle:
return [needle]
for child in root.children:
if findPath(child, needle) != Null:
return [root].concat(findPath(child, needle))
return Null
这应该是从根节点到针的路径。