2017-09-29 2 views
0

J'ai trois DataSets. DataSet 1 a tous les Ids parents, DataSet 2 a des enfants de DataSet 1 et DataSet 3 a des enfants de DataSet3.Créer un arbre: Arbre de récurrence ou d'expression C#

Je souhaite créer un DataSet de structures arborescentes avec l'ID de DataSet1 en tant que nœud racine.

DataSet 1-

<NewDataSet> 
    <Table> 
     <Id>A</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <Id>B</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <Id>C</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

DataSet 2-

<NewDataSet> 
    <Table> 
     <ParentId>A</ParentId> 
     <Id>AA</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <ParentId>B</ParentId> 
     <Id>BB</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <ParentId>B</ParentId> 
     <Id>CB</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

DataSet 3-

<NewDataSet> 
    <Table> 
     <ParentId>AA</ParentId> 
     <Id>AAA</Id> 
     <Desc>ABC</Desc> 
    </Table> 
    <Table> 
     <ParentId>BB</ParentId> 
     <Id>BBB</Id> 
     <Desc>DEF</Desc> 
    </Table> 
    <Table> 
     <ParentId>BB</ParentId> 
     <Id>CBB</Id> 
     <Desc>PQR</Desc> 
    </Table> 
</NewDataSet> 

résultat devrait être comme cela si vous ne spécifiez pas de nœud racine ou si je veulent les nœuds enfants ou non:

GetTree (null, false); Mais si je fournis un ID et fournissez également si je veux les enfants de l'Id. GetTree ("BB", true);

<NewDataSet> 
    <table> 
     <Id>BB</Id> 
     <Desc>ABC</Desc> 
     <HasChildren>True</HasChildren> 
     <DataSet> 
      <Table> 
       <Id>BBB</Id> 
       <Desc>ABC</Desc> 
       <HasChildren>False</HasChildren> 
      </Table> 
      <Table> 
       <Id>CBB</Id> 
       <Desc>PQR</Desc> 
       <HasChildren>False</HasChildren> 
      </Table> 
     </DataSet> 
    </table> 
</NewDataSet> 

GetTree ("BB", faux); Je sais que je peux le faire avec Nested Foreach mais je veux écrire une fonction récursive pour effectuer cette opération. J'ai cherché sur Internet pendant 2 jours maintenant pour quelques exemples et pas en mesure de le faire. Toute référence à un site Web m'aiderait aussi beaucoup.

Répondre

1

Foreach est probablement encore le chemin à parcourir, mais au lieu d'être imbriqué, vous l'utiliseriez une seule fois pour chaque 'nœud'.

public class MyDataSet 
{ 
    public string ID {get;set;} 
    public string Description {get;set;} 
    public readonly List<MyDataSet> Children = new List<MyDataSet>(); 
    public bool HasChildren 
    { 
     get { return Children.Count > 0 } 
    } 
    public void GetTree(string id, bool includeChildren) 
    { 
     MyDataSet mySet = id == null ? this : Children.FirstOrDefault(child => child.ID == id); 

     if(mySet == null) return; 
     // TODO: handle mySet 

     if(includeChildren) 
     { 
      foreach (MyDataSet child in Children) 
      { 
       child.GetTree(null, true); 
      } 
     } 
    } 
}