2014-11-21 87 views
0

我建立了一个树状结构,并有同时在这个问题Traversing a Tree Structure遍历树的结构和作用

我想实现与所述树节点类的动作的方法来解决它的几个问题。我很难理解如何做到这一点并实施它。我到目前为止是:

  internal void Traverse(Action<TreeNode<T>> action) 
      { 
       action(TreeNode<T>); 
       foreach (var child in this.children) 
        child.Traverse(action); 
      } 

任何解释和帮助将不胜感激。

我收到错误:

错误667树节点”是‘型’,而是使用类似‘变量’

错误668‘System.Collections.Generic.KeyValuePair>’不包含'Traverse'的定义和没有扩展方法'Traverse'接受'System.Collections.Generic.KeyValuePair>'类型的第一个参数可以被找到(你是否缺少using指令或程序集引用?)

回答

0

in the第一行,你需要传递一个变量。
基本上,呼叫动作就像你一个reglular功能:

action(myTreeNode) 

第二个错误是因为你忘了选择从字典中的“价值”。

 internal void Traverse(Action<TreeNode<T>> action) 
     { 
     action(this); 
     foreach (var child in this.children.Values) 
      child.Traverse(action); 
     } 

我已经实现了这样的功能,但问题是,你正在锁定自己的一种类型的遍历。我建议你坚持使用foreach来代替,这样你就可以使用LINQ修改你的遍历了。在你上一篇文章中,你展示了你让你的树实现了IEnumerable。这就是你需要启用LINQ的全部内容。

所以,你可以实现你的现行规定是这样的:

foreach (var node in MyTree) 
{ 
    // do stuff to node here 
{ 

而在未来,你可以做很酷的事情是这样的:

foreach (var node in MyTree.Where(n => n.Type == somethingOfInterest)) 
{ 
    // do stuff to node here 
{ 
+0

谢谢。这工作,但我没有得到行动(这)的一部分。是的,我了解字典错误的值部分。谢谢。 – PBrenek 2014-11-21 01:07:15

+1

我认为Traverse是TreeNode 类的成员。 – 2014-11-21 02:14:28

+0

谢谢。那么你是否建议我将Traverse方法从TreeNode类中取出并放到Tree类中? – PBrenek 2014-11-21 15:36:49