2014-11-21 4 views
0

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

ответ

0

в первой строке, вам нужно передать переменную.
В принципе, действие вызова так же, как вы бы 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

+1

Я предположил, что Траверс является членом класса TreeNode . –

+0

Спасибо. Итак, вы предлагаете мне взять метод Traverse из класса TreeNode и поместить его в класс Tree? – PBrenek

Смежные вопросы