我有一个excel文档,如下所示
+-------+-------+-------+
| Col1 | Col2 | Col3 |
+-------+-------+-------+
| item1 | | |
| | item2 | |
| | item3 | |
| | | item4 |
| | item5 | |
| item6 | | |
| | item7 | |
+-------+-------+-------+
在此表中;
item1
是item2, item3, item5
的父级
item3
是item4
的父级
item6
是item7
我想从这张表中生成一个树结构,但我无法弄清楚该怎么做。我怎么能用C#做到这一点。
由于
答案 0 :(得分:2)
保留所有列的父级列表。第一列的父级是树根。处理行时,将项目附加到resecive父项。 (如果没有这样的父级,则会出现错误,如果第4项位于第3列,则为敌人。)将添加的项目添加到列表中并删除所有较低的项目。
举例说明:
Expense_Id
当前项的父级是current item col pnt parent list
| | | | [root]
| item1 | | | 1 0 [root, item1]
| | item2 | | 2 1 [root, item1, item2]
| | item3 | | 2 1 [root, item1, item3]
| | | item4 | 3 2 [root, item1, item3, item4]
| | item5 | | 2 1 [root, item1, item5]
| item6 | | | 1 0 [root, item6]
| | item7 | | 2 1 [root, item6, item7]
,其中列表中父元素的索引是list[pnt]
。最近添加的元素始终是列表中的最后一个元素。
答案 1 :(得分:1)
递归函数CreateTree
创建一个从给定节点开始的树作为根。我假设输入数据可能是锯齿状数组,其中每个数组代表示例表中的一列。该节点由列中的row
标识,depth
是columns
锯齿状数组中的列。
internal class TreeNode<T> where T : class
{
public TreeNode(T payload)
{
Children = new List<TreeNode<T>>();
Payload = payload;
}
public List<TreeNode<T>> Children { get; }
public T Payload { get; }
}
public static TreeNode<T> CreateTree<T>(int row, int depth, T[][] columns) where T : class
{
var node = new TreeNode<T>(columns[depth][row]);
var maxDepth = columns.GetLength(0) - 1;
if (depth == maxDepth)
return new TreeNode<T>(columns[depth][row]);
var i = row + 1;
while (true)
{
if (i >= columns[depth].Length || columns[depth][i] != null)
break;
if (columns[depth + 1][i] != null)
{
var child = CreateTree(i, depth + 1, columns);
node.Children.Add(child);
}
i++;
}
return node;
}
以下是基于您的示例的用法。但是,在该示例中,树的深度为3,此解决方案适用于可变长度深度。
var depth = 3;
var columns = new string[depth][];
columns = new[]
{
new string[] {"item1", null, null, null, null, "item6", null},
new string[] {null, "item2", "item3", null, "item5", null, "item7"},
new string[] {null, null, null,"item4", null, null, null},
};
var topLevelColumn = columns[0];
var roots = new List<TreeNode<string>>();
for (int i = 0; i < topLevelColumn.Length; i++)
{
if (topLevelColumn[i] != null)
roots.Add(CreateTree(i, 0, columns));
}