【发布时间】:2015-02-08 08:50:31
【问题描述】:
我有一个现有的课程:
public class Product
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Info { get; set; }
}
我也有一个给定的List<Product>:
var Lst = new List<Product>();
Lst.Add(new Product{ Id=1,ParentId=0,Info="a"});
Lst.Add(new Product{ Id=2,ParentId=0,Info="a"});
Lst.Add(new Product{ Id=3,ParentId=0,Info="a"});
Lst.Add(new Product{ Id=60,ParentId=1,Info="a"});
Lst.Add(new Product{ Id=61,ParentId=1,Info="a"});
Lst.Add(new Product{ Id=62,ParentId=61,Info="a"});
Lst.Add(new Product{ Id=72,ParentId=61,Info="a"});
Lst.Add(new Product{ Id=90,ParentId=2,Info="a"});
可视化:
1
|
+---60
|
+---61
|
+---62
|
+---72
2
|
+---90
3
如您所见,List<> 是 flat。 (所有项目在列表中处于同一级别。只是id,parentId代表层次结构)
现在 - 我需要创建结构 List<> 以便 List 中的每个项目将在 内部 其父对象:
所以我创建了一个额外的结构类来保存这个结构:
public class Node
{
public Product Product { get; set; }
public List<Node> LstNodes { get; set; }
}
所以现在我可以做:
List<Node> lstNodes = new List<Node>();
最初我可以添加根目录:
lstNodes=Lst.Where(product=>product.ParentId==0).Select(node=>new Node{Product=node}).ToList();
现在我可以开始递归插入他们父母的项目。
那么问题出在哪里?
问题:
我想避免首先插入根元素(根是ParentId=0)。
有没有办法用 one 递归方法(包括根)来做到这一点?
期望的结果:lstNodes 中的 3 个节点,每个节点递归地都有其子节点。
【问题讨论】:
-
如果您传递带有 Id->Node 的字典以将孩子与他们的父母联系起来,那么您可以以 declerative 风格执行此操作。但在这种情况下,我会以老式的
foreach循环样式执行此操作;) - 顺便说一句:应该为 Id 排序列表以使其变得非常容易,但它似乎已经是 -
老实说,我无法弄清楚如何递归地执行此操作...