J'ai un grand ensemble de résultats assemblé dans une relation parent/enfant. J'ai besoin de marcher dans l'arbre et afficher les résultats à l'utilisateur.C# Itération de grand arbre
Je l'ai fait avant d'utiliser la récursivité, mais parce que mon jeu de résultats peut être grand, je veux éviter la possibilité de recevoir une exception StackOverflowException.
J'ai trouvé le suivant example sur MSDN qui utilise une pile. Le problème que j'ai est parce qu'une pile est le dernier entré, le premier, mes données n'apparaissent pas correctement. Je voudrais que ça ressemble à ce qui suit:
LeveL 1
Level 1.1
Level 1.1.1
Level 1.1.2
Level 1.2
Level 1.2.1
Level 1.2.2
Mais il ressemble à:
LeveL 1
Level 1.2
Level 1.2.2
Level 1.2.1
Level 1.1
Level 1.1.2
Level 1.1.1
Toutes les idées?
Voici un exemple de mon code. En supposant que le DataTable dt
a les colonnes suivantes: ID, ParentID et texte
private struct Item
{
public string Text;
public int ID;
public int ParentID;
}
private void BuildView()
{
Stack<Item> itemTree = new Stack<Item>(40);
//Get All Parent Nodes
DataView dv = new DataView(dt);
dv.RowFilter = "ParentID = 0";
//Add the parent nodes to the stack
foreach (DataRowView drv in dv)
{
Item item = new Item();
item.Text = drv["Text"].ToString();
item.ID = drv["ID"].ToString();
item.ParentID = drv["ParentID"].ToString();
itemTree.Push(item);
}
//Go through the stack one node at a time
while (itemTree.Count > 0)
{
Item currentItem = itemTree.Pop();
Debug.WriteLine(currentItem.Text);
//Get children of current node
dv.RowFilter = String.Format("ParentID = {0}", currentItem.ID);
if (dv.Count > 0)
{
//Add child nodes to the stack
foreach (DataRowView drvChild in dv)
{
Item item = new Item();
item.Text = drvChild["Text"].ToString();
item.ID = drvChild["ID"].ToString();
item.ParentID = drvChild["ParentID"].ToString();
itemTree.Push(item);
}
}
}
}
Je ne sais pas si ça marchera de cette façon. Peux-tu expliquer? – Niyaz
@Niyaz: Mise à jour de ma réponse avec un exemple. –
Oui. Mais pouvez-vous expliquer comment cela donnera la réponse requise? Je ne peux pas comprendre. – Niyaz