2014-02-10 56 views
2

美好的一天。我有一个递归遍历树节点方法的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>(或其他),指派一个操作/ lambda /委托给它,然后通过变量调用操作。

但是...

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); 
    } 
}