연결된 목록을 설명하는 XML 문서에 저장된 데이터가 있습니다.저장된 데이터에서 연결된 목록을 만드는 가장 효율적인 방법은 무엇입니까?
<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>
... 나는 .NET의 LinkedList
클래스를 사용하고, 12 20, 9, 34, 29, 30의 순서를 제공하기 : 데이터를 다음과 같이 보입니다 그래서 하나를 제외한 모든 노드는 다른를 따라 이 데이터를 반영하는 연결 목록을 만들지 만 값이 순서가 틀리기 때문에 구성하기가 어렵습니다. 내가 정말로하고 싶은 것은 데이터가 유효하다고 가정하는 것입니다. 정확하게 첫 번째 값이 있고 다른 모든 값은 목록의 다른 노드를 따르는 "후행"값을가집니다.
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))
});
}
}
가 말썽이 하나가 다음 차가,이 경우이 같은 코드 (FindFirstForwards
내가 주어진 람다가 true를 반환하는 최초의 연결리스트 항목을 찾기 위해 쓴 사용자 정의 확장 방법입니다) 좋은 것 orderedCars
에 아직 추가되지 않은 경우 FindFirstForwards
이 "following"ID가있는 자동차를 찾지 못했기 때문에 예외가 발생합니다. 내가 정말로하고 싶은 것은 "연결된 목록에 이것을 추가하고, 해당 항목이 아직 추가되지 않았더라도 특정 ID로 향후 항목을 따라 가며 계속 진행할 것이라고 가정합니다."라고 말합니다. 그런 다음 링크 된 목록의 무결성을 확인하여 각 노드가 다른 노드를 가리키고 하나의 헤드 노드가 있는지 확인하십시오.
간결한 방법이 있습니까? 그렇지 않다면이 XML을 메모리 내 연결 목록으로 변환하는 가장 효율적인 (그리고 코드 간결한) 방법은 무엇일까요?
+1. 꽤 좋은 것. 링크의 유효성을 검사하려면 빠른 관계 조회가 있어야하며, 목록이 없으면 사전이 빛난다. 사전에로드하고 거기에서 가져옵니다. – TomTom