-1

如何使用 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>();
4

1 回答 1

1

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

如果我们假设您的输入是有效的,那就是:

  1. 它包含一个没有后继节点的节点。
  2. 它包含一个没有任何指向它的节点(即头节点)。
  3. 每个节点仅由另一个节点指向(除了#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

只要满足以上三个条件,它仍然可以工作。

于 2013-09-23T21:21:47.693 回答