Обход древовидной структуры и действий

Я построил древовидную структуру, и у меня было несколько проблем с ней, которые были решены в вопросе Обход древовидной структуры

Я хотел бы реализовать метод с действием в классе 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», и не может быть найден метод расширения «Traverse», принимающий первый аргумент типа «System.Collections.Generic.KeyValuePair>» (вы отсутствует директива использования или ссылка на сборку?)


person PBrenek    schedule 21.11.2014    source источник


Ответы (1)


в первой строке вам нужно передать переменную.
По сути, вызовите действие так же, как и обычную функцию:

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
{
person Adam C    schedule 21.11.2014
comment
Спасибо. Это сработало, но я не понимаю действие (эту) часть. Да, я понимаю, что значения являются частью ошибки словаря. Спасибо. - person PBrenek; 21.11.2014
comment
Я предположил, что Traverse является членом класса TreeNode‹T›. - person Adam C; 21.11.2014
comment
Спасибо. Итак, вы предлагаете мне взять метод Traverse из класса TreeNode и поместить его в класс Tree? - person PBrenek; 21.11.2014