c# - 如何根据依赖关系重新排列数组中的项目?并检测任何循环依赖

标签 c# arrays sorting cyclic-dependency

给定类型:

class Field{
    public string Name{get;set;}
    public string[] DependsOn{get;set;}
}

假设我有一组 Field 项:

List<Field> fields = new List<Field>();
fields.Add(new Field() { Name = "FirstName" });
fields.Add(new Field() { Name = "FullName", 
                         DependsOn = new[] {"FirstName","LastName"}});
fields.Add(new Field() { Name = "Age", 
                         DependsOn = new[] { "DateOfBirth" } });
fields.Add(new Field() { Name = "LastName" });
fields.Add(new Field() { Name = "DateOfBirth" });

很明显,我们按以下顺序获取元素:

  1. 名字
  2. 全名
  3. 年龄
  4. 姓氏
  5. 出生日期

我的第一个问题: 重新排列我的列表/数组中的项目的最佳方法是什么,以便从属列(全名和年龄)放置在它们所依赖的列之后,即像这样:

  1. 名字
  2. 姓氏
  3. 全名
  4. 出生日期
  5. 年龄

所以像Age这样的字段总是在它依赖的DateOfBirth之后。

我的第二个问题: 有没有办法检测循环依赖?即当
Field1 取决于 Field2
Field2 取决于 Field3
Field3 取决于 Field1

这样我们就不会陷入困境。例如大学毕业后,您需要 2 年的工作经验才能找到工作。但要获得工作经验,您首先需要拥有这份工作。

最佳答案

听起来您需要按拓扑顺序对这些项目进行排序。网络上有很多页面,维基百科可能是一个不错的起点: http://en.wikipedia.org/wiki/Topological_sort

关于c# - 如何根据依赖关系重新排列数组中的项目?并检测任何循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546586/

相关文章:

c# - 如何在c#中保留锯齿状数组的一些列和行并删除不需要的列和行

C++ 数组中最大的数字。正面及负面

algorithm - 为什么log在算法复杂度中出现的如此频繁?

java - 如何按第二个词对列表进行排序?

c# - 我怎样才能减少 IEnumerable<IEnumerable<Foo>> 到 IEnumerable<Foo>?

c# - MVC 默认区域不工作

java - 将 int 转换为 int 数组

python - Django:如何从多个模型中按日期获取对象?

c# - IAsyncDisposable 引用实现错误?

c# - 使用 XSLT 将 XML 转换为固定长度的文本文件