首页 > 解决方案 > 递归 LINQ 查询函数中的嵌套索引

问题描述

我有一个递归 LINQ 查询函数,它将平面树结构从数据库转换为层次结构树。现在我想将索引添加到每个树叶。问题是索引必须从其父级嵌套。

这是LINQ递归函数

    public IList<QuestionGroupTree> FlatToHierarchy(IEnumerable<QuestionGroupTree> list, string parentId)
    {
        return list.Where(i => i.CParentId == parentId)
            .Select((v, i) => new QuestionGroupTree {
            CNodeId = v.CNodeId, 
            CParentId = v.CParentId,
            CNodeName = v.CNodeName,
            Children = FlatToHierarchy(list, v.CNodeId),
            NodeIndex = i + 1
        }).ToList();

    }

如您所见,我试图从 LINQ 函数中获取索引并将其放入NodeIndex属性中。但它不是从它的父级堆叠起来的。

这是输出

1. Customer Service
  1. MalFunction
    1. Host Failure
      1. Contact Information
      2. Models
      3. OnSet
      4. Other Service
      5. Warranty

这是我所期望的

1. Customer Service
  1.1. MalFunction
    1.1.1. Host Failure
      1.1.1.1. Contact Information
      1.1.1.2. Models
      1.1.1.3. OnSet
      1.1.1.4. Other Service
      1.1.1.5. Warranty
2. Blah Blah
   2.1. Blah Blah

所以我真的不知道在递归方面如何从父级获取嵌套索引。与嵌套的 for 循环不同,我们可以简单地获取父级。

就像是

for(var i)
  for(var j)
    for(var k)
      console.log(i + '. ' + j + '. ' + k)

标签: c#asp.netentity-frameworklinqrecursion

解决方案


尝试将类型更改NodeIndex为字符串而不是 int。然后,您可以将父索引传递给您的函数,并使用它为 NodeIndex 创建前缀。

请参阅示例:

public IList<QuestionGroupTree> FlatToHierarchy(IEnumerable<QuestionGroupTree> list, string parentId, string parentIndex)
{
    var prefix = string.IsNullOrWhiteSpace(parrentIndex) ? "" : parrentIndex+".";
    return list.Where(i => i.CParentId == parentId)
        .Select((v, i) => new QuestionGroupTree {
        CNodeId = v.CNodeId, 
        CParentId = v.CParentId,
        CNodeName = v.CNodeName,
        Children = FlatToHierarchy(list, v.CNodeId, prefix+(index + 1)),
        NodeIndex = prefix+(index + 1)
    }).ToList();

}

推荐阅读