Вот как бы я подошел к этому:
Создание класса и коллекции для хранения вложенной иерархии элементов (это может быть расширено позже, если потребуется больше подробностей).
public class Element
{
public Element(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
public ElementCollection Children = new ElementCollection();
// This method is used to add the specified child name if it does not currently
// exist, or return the existing one if it does
public Element AddOrFetchChild(string sName)
{
Element oChild;
if (this.Children.ContainsKey(sName))
{
oChild = this.Children[sName];
}
else
{
oChild = new Element(sName);
this.Children.Add(sName, oChild);
}
return oChild;
}
}
public class ElementCollection : System.Collections.Generic.Dictionary<string, Element>
{
}
Затем проанализируйте ваши данные в коллекции (обратите внимание, что это будет поддерживать любой уровень вложенности в вашей структуре записей без необходимости изменения кода):
string[] asLines;
// ToDo: Add code here to populate the collection of lines to process
// Create a base element that makes popuplation of the elements easier
Element BaseElement = new Element("");
// Cycle through each of the lines
foreach (string sLine in asLines())
{
// Get the components out of the line
string[] asElements = sLine.Split("|");
// Starting with the base element
Element oParentElement = BaseElement;
// Cycle through each of the elements that were found, adding the current value to the parent's
// collection of children, then using the new or found item as the parent for the next item in the list
for (int nI = 0; nI < asElements.Length; nI++)
{
oParentElement = oParentElement.AddOrFetchChild(asElements[nI]);
}
}
// Finally, add the nodes to the tree recursively
AddNodesToTree(BaseElement.Children, this.treeView1.Nodes);
и это рекурсивный метод, используемый для добавления элементов в дерево
/// <summary>
/// A recursive method to add all of the records to the specified collection of nodes
/// </summary>
/// <param name="cRecords"></param>
/// <param name="cNodes"></param>
private void AddNodesToTree(ElementCollection cRecords, TreeNodeCollection cNodes)
{
foreach (Element oRecord in cRecords.Values)
{
TreeNode oNode = new TreeNode();
oNode.Text = oRecord.Name;
oNode.Tag = oRecord;
cNodes.Add(oNode);
// Now add the node's children if any
if (oRecord.Children.Count != 0)
{
AddNodesToTree(oRecord.Children, oNode.Nodes);
}
}
}