c# - 按依赖关系排序列表

标签 c# sorting compare

给出以下列表:

var modules = new List<Module>() {
    new Module() { Name = "Audits", Dependencies = new[] { "Logs" } },
    new Module() { Name = "Blog", Dependencies = new[] { "Content", "Tags" } },
    new Module() { Name = "Content", Dependencies = new[] { "Audits" } },
    new Module() { Name = "Logs" },
    new Module() { Name = "Tags" }
};

我需要创建一种以编程方式排序此列表的方法,以便最可靠的模块位于顶部。因此,使用上面的示例所需的顺序是:

  1. 日志
  2. 审核
  3. 内容
  4. 标签
  5. 博客

由于“内容”依赖于“审核”,因此“审核”首先出现。但由于“审计”依赖于“日志”,因此“日志”高于“审计”,依此类推。 “博客”出现在最后,因为它依赖于“内容”和“标签”,因此它们位于上方。

我希望我已经足够清楚地描述了我的问题。我确信有一些聪明的算法可以处理这个问题并使其尽可能高效,但到目前为止它已经提到了我。如果有人能指出我正确的方向,我将不胜感激。

谢谢

最佳答案

您所描述的问题称为 topological sort :给定部分排序,尝试找到尊重该排序的线性描述。

解决此问题的典型算法需要 O(|V| + |E|) 时间,其中 |V| 是顶点数(您的模块中的模块)示例),|E| 是边数(示例中的依赖项)。

链接的维基百科文章还提供 pseudo code 。将算法转换为您的示例需要一些记录,但它相对简单。

关于c# - 按依赖关系排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609070/

相关文章:

c# - 由于应用程序/dime (.Net) 的内容类型导致使用 Web 服务时出错

c# - .NET Framework 中是否存在用于比较的现有委托(delegate)?

php - 以日期为键对数组进行排序

c# - 如何在 ASP.NET MVC 3 项目的服务层生成 URL

c# - 使用 .Net Socket 从 http 服务器下载并保存文件

compare - 在 Sublime Text 中比较两个文件的内容

C++:另一个 'check if pointer is null'

python - 重写 __eq__ 和 __hash__ 来比较两个实例的字典属性

c# - 使用 syndicationitem 获取自定义 rss 提要项目元素?

javascript - 客户端所有页面的 Angular 分页列排序