【问题标题】:Traversing a Tree Structure and Action遍历树结构和动作
【发布时间】:2014-11-21 10:30:23
【问题描述】:

我已经建立了一个树形结构,并在问题Traversing a Tree Structure 中解决了一些问题

我想在 TreeNode 类中实现一个带有动作的方法。我很难理解如何做到这一点并实施它。到目前为止我所拥有的是:

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

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

我收到错误:

错误 667 TreeNode' 是一个“类型”,但用作“变量”

错误 668“System.Collections.Generic.KeyValuePair>”不包含“Traverse”的定义,并且找不到接受“System.Collections.Generic.KeyValuePair>”类型的第一个参数的扩展方法“Traverse” (您是否缺少 using 指令或程序集引用?)

【问题讨论】:

    标签: c# tree action


    【解决方案1】:

    在第一行,你需要传递一个变量。
    基本上,就像调用常规函数一样调用 action:

    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
    {
    

    【讨论】:

    • 谢谢。这有效,但我没有得到 action(this) 部分。是的,我理解字典错误中的值部分。谢谢。
    • 我假设 Traverse 是 TreeNode 类的成员。
    • 谢谢。那么你是不是建议我将 Traverse 方法从 TreeNode 类中取出并放在 Tree 类中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多