J'ai un XElement à peu près fait comme ceci:F #: arbre récursif
<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>
[..]
chaque tâche élément a un identifiant unique, certaines informations que je ne suis pas de rapports et un ID parent. L'identifiant parent fait référence à une autre tâche de sorte qu'il est possible de représenter un arbre.
J'ai déjà une fonction C# pour trier cette structure:
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);
}
}
Ici je continue d'invoquer récursive la fonction de recherche des enfants des éléments de chaque nœud et en ajoutant la nouvelle à un XElement appelé taskOutput. Chaque fois que je passe une référence à ce nouvel objet, l'id de l'élément courant (qui représente le parent dans l'appel suivant) et le XElement original avec toutes les tâches.
Maintenant, je pensais que ce serait un bon cas de test pour apprendre un peu sur F # simplement réécrire cette chose d'une manière fonctionnelle, mais j'ai des problèmes avec elle.
C'est ce que je suis arrivé à ce jour:
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)
Il ne compile pas spécifier que le type de retour pour let (en let children
) a une erreur.
Une aide pour que je comprenne mieux? Merci beaucoup
Salut Brian, merci pour ce code, mais il me donne toujours la même exception de stackoverflow – pistacchio
Nevermind, il me manque la partie "t à x" dans le autre poste. Cela fonctionne maintenant :) Merci beaucoup pour le soutien – pistacchio