Iterativ würde könnte es so aussehen:
Code:
var columnIndexes = new
{
Level = dataTable.Columns.IndexOf("Level"),
Name = dataTable.Columns.IndexOf("Name"),
};
var treeView = new TreeView();
var nodesByName = new Dictionary<DataRow, TreeNode>();
var numberOfNodes = (from index in Enumerable.Range(0, dataTable.Rows.Count)
let row = dataTable.Rows[index]
let level = row.Field<int>(columnIndexes.Level)
// nehme all rows bis zur vorherigen Zeile, finde den ersten von hinten mit geringerem Level
let parentRow = (from t in dataTable.AsEnumerable().Take(index).Reverse()
where t.Field<int>(columnIndexes.Level) < level
select t).FirstOrDefault()
let parentNodes = parentRow != null ? nodesByName[parentRow].Nodes : treeView.Nodes
select nodesByName[row] = parentNodes.Add(row.Field<string>(columnIndexes.Name))).Count();
Das "Count()" ist nötig damit die Abfrage überhaupt ausgeführt wird. LINQ ist lazy by design.
Voraussetzung ist, dass die Reihenfolge stümmt!