【发布时间】:2018-09-17 21:23:47
【问题描述】:
我正在使用由单个“根”TreeNodeDefinition 记录组成的树型结构,该记录可以包含其他 TreeNodeDefinition 类的列表,然后每个类都可以包含进一步的列表等等。
我基本上希望能够遍历树结构中的所有节点并检查每个节点是否满足条件,然后将该定义记录添加到列表中。我想出了一种方法来做到这一点,但我不禁认为有一种更有效的方法:
List<ITreeNodeDefinition> treeNodeDefinitions = new List<ITreeNodeDefinition>();
treeNodeDefinitions = treeFactory.SearchNodesByRelationshipId(treeNodeDefinition, relationshipId, new List<ITreeNodeDefinition>());
第一个参数是我的根节点定义记录,第二个参数是我需要比较每个节点的参数,最后我传入一个空列表,每次节点匹配我的检查时我想要填充该列表。方法如下:
public List<ITreeNodeDefinition> SearchNodesByRelationshipId(ITreeNodeDefinition treeNodeDefinition, int? relationshipId, List<ITreeNodeDefinition> tndList)
{
if (treeNodeDefinition.RelationshipId == relationshipId)
{
tndList.Add(treeNodeDefinition);
}
if (treeNodeDefinition.Nodes.Count != 0)
{
foreach (ITreeNodeDefinition nodeDefinition in treeNodeDefinition.Nodes)
{
List<ITreeNodeDefinition> tempTable = this.SearchNodesByRelationshipId(nodeDefinition, relationshipId, tndList);
}
}
return tndList;
}
如您所见,该方法为在 treeNodeDefinition.Nodes 列表中找到的每个子节点调用自身。这回到了一个我从不做任何事情的临时表......这对我来说效率低下。我想知道是否有更直接的方式来导航这种结构......我确定我只是错过了一个技巧。
【问题讨论】:
-
刚刚想到要为我要填充的列表使用 out 参数...?现在将对其进行测试......但仍然欢迎任何更聪明的建议!
-
你的树形结构有多深?此递归将根据深度破坏堆栈。
-
不要用完。您将无法将运行列表传递给嵌套调用
-
您尚未展示您的数据是如何存储的。您可以安排数据,以便可以通过这种方式有效地搜索。 (将所有节点放在一个列表中,您可以轻松搜索)
-
树视图的深度不会超过几个层次,但是这些树视图在某种程度上是用户创建的,因此从技术上讲它可以变得更深。不过,我仍然需要能够进行上述检查。