-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. 後続ノードを持たない 1 つのノードが含まれています。
  2. 何も指していない 1 つのノード (つまり、ヘッド ノード) が含まれています。
  3. 各ノードは、他の 1 つのノードのみによってポイントされます (ただし、#2 で説明されている、何もポイントされていないノードを除く)。

辞書を作成します。

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

データ定義の使用:

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

現在、ディクショナリには、どのノードの値にも含まれていないキーが 1 つあります。(つまりStep、 でもないものNextStep。) たとえば、AS1は値に存在しません。次の方法でその 1 つのキーを取得できます。

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

ExceptKeysにないアイテムをすべて表示しValuesます。データが上記の基準を満たしている場合、そのようなキーは 1 つだけ存在します。

それがリストの先頭です。そこから始めて、リストを順番に見ていくことができます。

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

上記の 3 つの条件が満たされている限り、引き続き機能します。

于 2013-09-23T21:21:47.693 に答える