通常,您正在构建的是一个链表,其中每个节点都指向其后继节点。
如果我们假设您的输入是有效的,那就是:
- 它包含一个没有后继节点的节点。
- 它包含一个没有任何指向它的节点(即头节点)。
- 每个节点仅由另一个节点指向(除了#2 中描述的节点,它没有任何指向它的节点)。
创建字典:
Dictionary<string, string> dict = new Dictionary<string, string>();
使用您的数据定义:
foreach (var step in s)
{
dict.Add(step.Step, step.NextStep);
}
现在,字典中有一个键不在任何节点的值中。(即Step
不是也是 的NextStep
。)例如,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 可能有更简洁的方法来执行此操作。
这个解决方案的美妙之处在于它不假设任何关于 id 的字典顺序。顺序可能是:
Foo Bar
Bar Fooby
Fooby Zoom
Zoom Zip
Zip Alpha
Alpha Queen
Queen NULL
只要满足以上三个条件,它仍然可以工作。