2014-02-10 3 views
2

Добрый день. У меня есть метод рекурсивной траверсы TreeNode в TreeView:Рекурсия и анонимный метод в C#

public void ShowTree(TreeView tree) 
{ 
    foreach (TreeNode node in tree.Nodes) 
    { 
     ShowNode(node); 
    } 
} 

private void ShowNode(TreeNode node) 
{ 
    MessageBox.Show(node.ToString()); 
    foreach (TreeNode child in node.Nodes) 
    { 
     ShowNode(child); 
    } 
} 

Но я должен иметь избыточный метод «ShowNode», который нигде не используется. Как сделать этот метод анонимным и объединить эти два метода?

ответ

5

Если вы в собираются разделить это, я бы на самом деле расколоть рекурсии часть от «что вы делаете с каждым узлом» часть. Так что-то вроде этого:

public static void ApplyRecursively<T>(this IEnumerable<T> source, 
             Action<T> action, 
             Func<T, IEnumerable<T>> childSelector) 
{ 
    // TODO: Validation 
    foreach (var item in source) 
    { 
     action(item); 
     childSelector(item).ApplyRecursively(action, childSelector); 
    }   
} 

Тогда вы можете назвать его как:

allNodes.ApplyRecursively(node => MessageBox.Show(node.ToString()), 
          node => node.Nodes); 

Это предполагает, что вы используете правильный общий TreeView/TreeNode класса пары. Если это номера от System.Windows.Forms, вам также нужно позвонить Cast.

allNodes.Cast<TreeNode>() 
     .ApplyRecursively(node => MessageBox.Show(node.ToString()), 
          node => node.Nodes.Cast<TreeNode>()); 
3

Я бы сохранил отдельный метод. Это обычно более аккуратный, чем использование переменной, напечатанной Action<TreeNode> (или что-то еще), назначая ей действие/лямбда/делегат, а затем вызывает действие через переменную.

Но ..

public void ShowTree(TreeView tree) 
{ 
    // Must assign null first .. 
    Action<TreeNode> showNode = null; 

    showNode = (node) => { 
     MessageBox.Show(node.ToString()); 
     foreach (TreeNode child in node.Nodes) 
     { 
      // .. so this won't be an "unassigned local variable" error 
      showNode(child); 
     } 
    }; 

    foreach (TreeNode node in tree.Nodes) 
    { 
     showNode(node); 
    } 
} 
Смежные вопросы