优化树下类似层次结构的后续子节点的排序

时间:2014-06-10 04:50:00

标签: c# sorting

我有一个有3个子节点的根节点。每个子节点都有自己的子节点。这些子节点保持为列表。我想从上到下对整个树进行排序。例如:首先对3个子节点(根据其名称)进行排序,然后对它们下面的子节点进行排序。我也知道树的高度是6。 这不是一个数据结构树,但我称它为树,因为它具有这种结构。我已经实现了一个排序机制,它的工作正常,但我担心这不是实现排序的最佳方式。

//sort the child nodes under root
GlobalProperties.Tree.ChildNodes.Sort((x,y) => x.Name.CompareTo(y.Name));

foreach (var node in GlobalProperties.Tree.ChildNodes)
{
    //sorting at second level
    node.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name));

    foreach (var secNode in node.ChildNodes)
    {
        //sorting at third level
        secNode.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name));
        foreach (var terNode in secNode.ChildNodes)
        {
            //sorting at fourth level
            terNode.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name));
            foreach (var fourthNode in terNode.ChildNodes)
            {
                 //sorting at fifth level
                 fourthNode.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name));
            }
        }
    }
}

有没有更好的方法来实现相同的功能?

3 个答案:

答案 0 :(得分:2)

在这种情况下我会选择扩展方法 -

public static class XmlExtensions{
     public static void SortChildren(tihs XmlNode node){
          node.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name));
          node.ChildNodes.ForEach(x => x.SortChildren());
     }
}

然后用它作为 -

GlobalProperties.Tree.SortChildren();

答案 1 :(得分:1)

假设您的所有节点都有一个共同的基本类型。 您可以为您的基本类型提供排序功能。

private void Sort()
{
     this.ChildNodes.Sort((x, y) => x.Name.CompareTo(y.Name)); // your sort

     foreach (var node in this.ChildNodes)
    {
         node.Sort(); // this calls the Sort function for all children
    }
}

node.Sort()是一个递归调用。它会被所有孩子召唤。然后所有的孩子将再次为他们所有的孩子打电话,直到你在树的底部。

答案 2 :(得分:0)

我通常不喜欢通过优化代码来分散注意力,除非性能明显变慢,只要你的代码干净,可读和正确,我就不用担心了。使用前一个答案中指示的递归函数会使它更容易阅读,所以我肯定会考虑这一点。