c# - 通过 C# 中的递归将 Flat List<T> 转换为结构化 List<T>?

标签 c# generics recursion

我有一个现有的类:

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/

相关文章:

delphi - 如何使用 Delphi 一步初始化 TList<T>?

list - 列表中的序言递归,最后一个元素

python - 函数内的函数,python 在列表上递归

java - 如何反转数组中的字符串?

c# - 如何在 Visio 中读取形状的属性

c# - 如何在 C# 中使用列表创建循环

java - Java 中菱形运算符 (<>) 的作用是什么?

c# - 将通用集合转换为字符串列表

c# - 使用 DataTable.select 时启用区分大小写

C# 从泛型方法调用泛型方法