我有一个有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));
}
}
}
}
有没有更好的方法来实现相同的功能?
答案 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)
我通常不喜欢通过优化代码来分散注意力,除非性能明显变慢,只要你的代码干净,可读和正确,我就不用担心了。使用前一个答案中指示的递归函数会使它更容易阅读,所以我肯定会考虑这一点。