나는 대략 다음과 같이 이루어하여 XElement 있습니다F 번호 : 재귀 트리
<Tasks>
<Task>
<Parent>0</Parent>
<Id>1</Id>
</Task>
<Task>
<Parent>1</Parent>
<Id>2</Id>
</Task>
<Task>
<Parent>1</Parent>
<Id>3</Id>
</Task>
<Task>
<Parent>3</Parent>
<Id>5</Id>
</Task>
[..]
각 작업 요소는 고유 한 ID를 가지고, 내가보고 아니에요 몇 가지 정보와 부모 ID입니다. 상위 ID는 트리를 나타낼 수 있도록 다른 타스크를 참조합니다. 여기
private void SortTask(ref XElement taskOutput, XElement tasks, string parent)
{
var children = from t in tasks.Elements("Task")
where t.Element("Parent").Value == parent
select t;
foreach (XElement task in children.AsEnumerable())
{
taskOutput.Add(task);
SortTask(ref taskOutput, tasks, task.Element("Id").Value);
}
}
내가 각 노드의 자식 요소를 검색하고 taskOutput라는 새로운 XElement를에 추가 재귀 적으로 함수를 호출 유지 :
는 이미이 구조를 정렬하는 C#을 기능을 가지고있다. 이 새 객체에 대한 참조를 전달할 때마다 현재 요소의 ID (다음 호출에서 부모를 나타내는)와 모든 작업이 포함 된 원래 XElement입니다.
이제 F #에 대해 간단하게 기능적으로 다시 작성하는 것에 대해 배울 수있는 좋은 테스트 케이스라고 생각했지만 문제가 있습니다.
이것은 내가 지금까지 무엇을 가지고 있습니다 :
type TaskManager(taskListXml) =
member o.taskList = XElement.Parse(taskListXml).Elements(XName.op_Implicit("Task"))
member o.Sort =
let parent =
o.taskList
|> Seq.find (fun t -> t.Element(XName.op_Implicit("Parent")).Value.Equals("0"))
let rec doSort t =
let parId = t.Element(XName.op_Implicit("Id")).Value
let children =
o.tasklist
|> Seq.filter (fun x -> x.Element(XName.op_Implicit("Parent")).Value.Equals(parId))
|> Seq.iter (fun x -> Console.WriteLine(x))
|> Seq.iter (fun x -> doSort x)
그것은 (let children
에서)하자에 대한 반환 형식에 오류가 있음을 지정 컴파일되지 않습니다.
더 잘 이해하게 도와주세요. 고맙습니다.
안녕하세요 Brian,이 코드를 이용해 주셔서 감사합니다.하지만 여전히 동일한 stackoverflow 예외를 제공합니다. – pistacchio
신경 쓰지 마세요. 다른 게시물. 지금은 작동합니다 :) 지원해 주셔서 대단히 감사합니다. – pistacchio