我有一个现有的类:
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<>
是平坦的。 (所有项目在列表中都处于同一级别。只是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();
现在我可以开始递归插入项目及其 parent 。
那么问题出在哪里?
问题:
我想避免首先插入根元素(根是 ParentId=0
的位置)。
有没有办法用一个递归方法(包括根)来做到这一点?
期望的结果:lstNodes
中的 3 个节点每个递归地都有它的 child 。
最佳答案
是这样的吗?
List<Node> GetNodes(List<Product> lst, int parentId = 0)
{
var childProducts = lst.Where(x=>x.ParentId == parentId);
return childProducts
.Select(x=> new Node { Product = x, LstNodes = GetNodes(lst, x.Id)}
.ToList();
}
和纯通用版本:
class Node<T>
{
public T Item { get; set; }
public List<Node<T>> LstNodes { get; set; }
}
List<Node<T>> GetNodes<T>(List<T> lst, Func<T, int> idSelector, Func<T, int> parentIdSelector, int parentId = 0)
{
var childProducts = lst.Where(x=>parentIdSelector(x) == parentId);
return childProducts
.Select(x=> new Node<T> { Item = x, LstNodes = GetNodes<T>(lst, idSelector,parentIdSelector, idSelector(x))})
.ToList();
}
GetNodes(Lst,x=>x.Id,x=>x.ParentId, 0);
关于c# - 通过 C# 中的递归将 Flat List<T> 转换为结构化 List<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27396279/