美好的一天。我无法理解哪种方法最好使用:在访问它时计算属性或每次必须更改时计算属性。例如,实现Level属性的两种方法:
public class TreeNode
{
public TreeNode()
{
ChildNodes = new Collection<TreeNode>();
}
public Collection<TreeNode> ChildNodes { get; private set; }
public TreeNode ParentNode { get; private set; }
public int Level
{
get
{
if (ParentNode != null) return ParentNode.Level + 1;
else return 0;
}
}
pubic void Add(TreeNode node)
{
this.ChildNodes.Add(node);
node.ParentNode = this;
}
public void TraverseNodes(Action<TreeNode> action)
{
action(this);
foreach (CTreeNode child in this.ChildNodes)
{
child.TraverseNodes(action);
}
}
}
最好使用以上还是以下?
public class TreeNode
{
public TreeNode()
{
ChildNodes = new Collection<TreeNode>();
Level = 0;
}
public Collection<TreeNode> ChildNodes { get; private set; }
public TreeNode ParentNode { get; private set; }
public int Level { get; private set; }
pubic void Add(TreeNode node)
{
this.ChildNodes.Add(node);
node.ParentNode = this;
node.TraverseNodes(eachNode =>
{
eachNode.Level += this.Level + 1;
});
}
public void TraverseNodes(Action<TreeNode> action)
{
action(this);
foreach (CTreeNode child in this.ChildNodes)
{
child.TraverseNodes(action);
}
}
}
答案 0 :(得分:1)
您可以问自己的一些问题是:
在您的情况下,您建议的第二个解决方案存在开销 - 无论何时树发生更改,您都会在可能的大量节点上调用TraverseNodes。这很贵。
另一方面,每次访问节点时都会按需递归计算属性(第一个解决方案) - 如果您可能访问Level
属性,则会成为问题很多。
所以这一切都取决于你使用Level
属性的程度。如果您经常使用它,而不是经常向树中添加内容,请考虑使用第二种解决方案。
如果您经常更换树,而不是非常关注Level
,那么使用您的第一种方法可能会更好。
但是,您最好的选择是尝试使用典型的使用方案和基准。然后你会得到明确的答案。