使用 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>();
通常,
您正在构建的是一个链表,其中每个节点都指向其后继节点。
如果我们假设您的输入有效,即:
- 它包含一个没有后继节点的节点。
- 它包含一个没有任何指向它的节点(即头节点(。
- 每个节点仅由另一个节点指向(#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
只要满足上述三个条件,它仍然有效。