【问题标题】:What algorithm can I use for sorting this branching List in C#?我可以使用什么算法在 C# 中对这个分支列表进行排序?
【发布时间】:2012-08-14 13:37:51
【问题描述】:

我正在尝试创建一个有序的类别分支列表,这样我就可以找到任何子类别并在开头添加"-";以及该类别可能具有的任何子类别并添加"--" 等。

我的测试类属性如下所示:

    public int Id { get; set; }
    public int OrderInList { get; set; }
    public int ParentId { get; set; }
    public IList<TestCategories> Subcategories { get; set; }

例子:

Books
-Special Offers
--Fiction
-eBooks 
--Pdf
--Mobi
Maps
-United Kingdom
--Cumbria
--West Yorkshire

我有一个默认的根级别类别,包括 Id: 1ParentId: 1OrderInList: 1
所以上面的顺序看起来像:

Id   | ParentId  |  OrderInList   
 2         1             1      //Books
 3         2             1      //-Special Offers
 4         3             1      //--Fiction
 5         2             2      //-eBooks
 6         5             1      //--Pdf
 7         5             2      //--Mobi
 8         1             2      //Maps
 9         8             1      //-United Kingdom
 10        9             1      //--Cumbria
 11        9             2      //--West Yorkshire

如何对完全无序列表进行排序,使其看起来像上面那样?

【问题讨论】:

  • 那不是“分支列表”,那是一棵树。
  • 无法理解您的输入和您要查找的输出。您是否有要在树中转换的无序列表?或者您有想要在排序列表中转换的树?
  • 感谢 delnan 的纠正,我对术语有点不确定,所以我尽可能地描述了它!

标签: c# algorithm list sorting branch


【解决方案1】:

这种排序称为Topological Sorting。对列表进行拓扑排序的最简单方法是使用深度优先递归搜索:离开节点的顺序是反向拓扑的。如果您需要知道树中节点的深度以便知道在名称前面放置多少个破折号,您可以在深度优先递归方法中添加一个int level 变量。

您可以从Rosetta Code 借用一个实现——它在 C# 中没有,但在 Java 中应该很容易翻译。

【讨论】:

  • 拓扑排序对 IMO 的树没有多大用处。有更好的算法专门用于此。还是我错了?
  • @lcfseth 树是图的一个特例;由于 OP 要求一种排序方式,因此可以将其称为拓扑排序,尽管我同意当图是一棵树时它很少被称为。
  • 为此干杯!至少我有一些工作要做,并且知道我现在在寻找什么。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2013-08-18
相关资源
最近更新 更多