一般に、構築しているのはリンクされたリストであり、各ノードはその後続ノードを指しています。
入力が有効であると仮定すると、次のようになります。
- 後続ノードを持たない 1 つのノードが含まれています。
- 何も指していない 1 つのノード (つまり、ヘッド ノード) が含まれています。
- 各ノードは、他の 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();
Except
Keys
にないアイテムをすべて表示し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 つの条件が満たされている限り、引き続き機能します。