私は、リンクされたリストを記述するXML文書にデータを格納しています。私は.NETのLinkedList
クラスを使用してい保存されたデータからリンクリストを構築する最も効率的な方法は?
<cars>
<car id="9" follows="34" />
<car id="12" follows="20" />
<car id="20" follows="9" />
<car id="29" follows="30" />
<car id="30" />
<car id="34" follows="29" />
</cars>
... 30、29、34、9、20の順序を与えるために、12:1のデータは次のようになりますので、他に従わを除くすべてのノードこのデータを反映するためにリンクされたリストを作成することができますが、値が順不同であるため構築が面倒です。私が本当にやりたいことは、データが有効であることを前提としています。正確に1つの最初の値があり、他のすべての値はリストの他のノードに続く「追従」値を持っています。このようなコードは(FindFirstForwards
私は与えられたラムダがtrueを返す最初のリンクリストのエントリを見つけるために書いたカスタム拡張メソッドである)が良いでしょう:
LinkedList<CarInstance> orderedCars = new LinkedList<CarInstance>();
XPathNodeIterator xmlIterator = _nav.Select("/dflt:cars/dflt:car", _namespaceResolver);
while (xmlIterator.MoveNext()) {
if (!(xmlIterator.Current.Select("@follows").Count > 0)) {
orderedCars.AddFirst(new CarInstance {
CarId = int.Parse(xmlIterator.Current.GetAttribute("id", _defaultNamespace))
});
}
else {
orderedCars.AddAfter(orderedCars.FindFirstForwards(car => car.CarId == int.Parse(xmlIterator.Current.GetAttribute("follows", _defaultNamespace))), new CarInstance {
CarId = int.Parse(xmlIterator.Current.GetAttribute("id", _defaultNamespace))
});
}
}
この1つは、次の車がある場合はトラブルは、ありますorderedCars
にまだ追加されていない場合は、FindFirstForwards
が「フォロー」IDを持つ車を見つけられなかったため例外がスローされます。私が本当にやりたいことは、「リンクされたリストにこれを追加し、そのエントリがまだ追加されていなくても特定のIDを持つ将来のエントリが続くと仮定して実行します」と言います。最後に、リンクされたリストの完全性をチェックして、各ノードが別のノードを指していること、および1つのヘッドノードが存在することを確認します。
これを行う簡潔な方法はありますか?そうでない場合は、このXMLをメモリ内のリンクリストに変換する最も効率的な方法(できればコード簡潔な方法)は何でしょうか?
+1。かなり最高のもの。リンクを検証するには、高速リレーションシップを持っていなければならず、リストがそこで吸う - 辞書が輝きます。それらを辞書にロードし、そこから取り出します。 – TomTom