C#中的递归和匿名方法

Feo*_*akt 2 c# treeview recursion anonymous-methods

美好的一天.我在TreeView中有递归遍历TreeNode的方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我必须有多余的方法"ShowNode",这在其他任何地方都没有使用.如何制作这种匿名方法并合并这两种方法?

Jon*_*eet 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);
    }        
}
Run Code Online (Sandbox Code Playgroud)

然后你可以把它称为:

allNodes.ApplyRecursively(node => MessageBox.Show(node.ToString()),
                          node => node.Nodes);
Run Code Online (Sandbox Code Playgroud)

这假设您正在使用适当的通用TreeView/ TreeNode类对.如果是这些System.Windows.Forms,你也需要打电话Cast.

allNodes.Cast<TreeNode>()
        .ApplyRecursively(node => MessageBox.Show(node.ToString()),
                          node => node.Nodes.Cast<TreeNode>());
Run Code Online (Sandbox Code Playgroud)