Reputation: 61
Given the following class, used to build a tree hierarchy:
public class simpletest
{
public simpletest Parent { get; set; }
public IList<simpletest> Children { get; set; }
public string Name { get; set; }
}
How could I get a list of all objects for a specific level?
Here is some sample data (hopefully its formatted correctly):
var root = new simpletest() { Name = "Root" };
var level1childA = new simpletest() { Name = "level1childA", Parent = root };
var level1childB = new simpletest() { Name = "level1childB", Parent = root };
var level2childA = new simpletest() { Name = "level2childA", Parent = level1childA };
var level2childB = new simpletest() { Name = "level2childB", Parent = level1childA };
var level2childC = new simpletest() { Name = "level2childC", Parent = level1childB };
var level2childD = new simpletest() { Name = "level3childD", Parent = level1childB };
var level3childA = new simpletest() { Name = "level3childA", Parent = level2childA };
var level3childB = new simpletest() { Name = "level3childB", Parent = level2childA };
var level3childC = new simpletest() { Name = "level3childC", Parent = level2childB };
var level3childD = new simpletest() { Name = "level3childD", Parent = level2childB };
var level3childE = new simpletest() { Name = "level3childE", Parent = level2childC };
var level3childF = new simpletest() { Name = "level3childF", Parent = level2childC };
var level3childG = new simpletest() { Name = "level3childG", Parent = level3childD };
var level3childH = new simpletest() { Name = "level3childH", Parent = level3childD };
level2childA.Children = new List<simpletest> { level3childA, level3childB };
level2childB.Children = new List<simpletest> { level3childC, level3childD };
level2childC.Children = new List<simpletest> { level3childE, level3childF };
level2childD.Children = new List<simpletest> { level3childG, level3childH };
level1childA.Children = new List<simpletest> { level2childA, level2childB };
level1childB.Children = new List<simpletest> { level2childC, level2childD };
So for example, using node level3childE, how would I get all the nodes from the same level? The node names can be anything.
Upvotes: 0
Views: 3475
Reputation: 957
BlackBear's solution returns the next level down and cannot return the root/initial node which may be useful for binding. The code below will give you nodes at the level requested. Note also that depth is relative to the initial node and not the actual tree.
public IEnumerable<simpletest> NodesAtDepth(int depth)
{
if (depth <= 0 )
yield return this;
else if (depth > 1)
{
if (this.Children != null)
foreach (simpletest child in this.Children)
foreach (simpletest element in child.NodesAtDepth(depth - 1))
yield return element;
}
else
{
if (this.Children != null)
foreach (simpletest element in this.Children)
yield return element;
}
}
Upvotes: 0
Reputation: 22989
Here's an (untested) recursive approach implemented as a member function of simpletest:
IEnumerable<simpletest> ElementsAtDepth(int depth) {
if(depth > 0) {
foreach(simpletest child in this.Children)
foreach(simpletest element in child.ElementsAtDepth(depth - 1))
yield return element;
}
else {
foreach(simpletest element in this.Children)
yield return element;
}
}
Upvotes: 2