使用 C# - 序列操作链表方案对分层数据进行排序和排序

本文关键字:排序 数据 分层 方案 链表 操作 使用 | 更新日期: 2023-09-27 18:32:32

如何使用 C# 对以下数据进行排序和添加序列号?

Id    NextStepId
AS4   AS5
AS1   AS2
AS5   NULL
AS3   AS4
AS2   AS3

我希望输出按以下顺序 -

Id    NextStepId SEQ
AS1   AS2         1
AS2   AS3         2
AS3   AS4         3
AS4   AS5         4
AS5   NULL        5

更多信息 -

Public class WFStep{
public string Step{get;set;}
public string NextStep{get;set;}
}
List<WFStep> s = new List<WFStep>();

使用 C# - 序列操作链表方案对分层数据进行排序和排序

通常,

您正在构建的是一个链表,其中每个节点都指向其后继节点。

如果我们假设您的输入有效,即:

  1. 它包含一个没有后继节点的节点。
  2. 它包含一个没有任何指向它的节点(即头节点(。
  3. 每个节点仅由另一个节点指向(#2 中描述的节点除外,该节点没有任何指向它的内容(。

创建字典:

Dictionary<string, string> dict = new Dictionary<string, string>();

使用数据定义:

foreach (var step in s)
{
    dict.Add(step.Step, step.NextStep);
}

现在,字典中有一个键不在任何节点的值中。(即一个不是NextStep Step。例如,AS1 在值中不存在。您可以通过以下方式获取该密钥:

var firstNode = dict.Keys.Except(dict.Values).First();

Except将为您提供Keys中所有不在Values中的项目。如果您的数据符合上述条件,则只有一个这样的键。

这是名单的头。您可以从那里开始按顺序浏览列表。

int seq = 1;
var key = firstNode;
while (key != null)
{
    var next = dict[key];
    Console.WriteLine("Id: {0}, NextStepId: {1}, SEQ: {2}",
        key, next, seq);
    ++seq;
    key = next;
}

可能有一种更简洁的方法可以使用 LINQ 执行此操作。

这个解决方案的美妙之处在于它不假设ids的字典顺序。顺序可以是:

Foo     Bar
Bar     Fooby
Fooby   Zoom
Zoom    Zip
Zip     Alpha
Alpha   Queen
Queen   NULL

只要满足上述三个条件,它仍然有效。