Domanda

Good day. I have method for recursive traverse TreeNode in TreeView:

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

But I must have excess method "ShowNode", that is not used anywhere else. How to make this method of anonymous and to merge these two methods?

È stato utile?

Soluzione

If you are going to split this out, I would actually split the recursion part from the "what you do with each node" part. So something like this:

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

Then you can call it as:

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

This is assuming you're using a proper generic TreeView / TreeNode class pair. If these are the ones from System.Windows.Forms, you'll need to call Cast as well.

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

Altri suggerimenti

I would keep a separate method. It's generally tidier than using a variable typed Action<TreeNode> (or whatever), assigning an Action/lambda/delegate to it, and then invoking the Action through the variable.

But ..

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top