c# - 递归 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)
解决方案
尝试将类型更改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();
}
推荐阅读
- python - 从 Tensorflow CSV 服务函数中拆分字符串
- javascript - 从另一个具有值的数组的键创建一个数组
- javascript - TypeScript 中的可变泛型类型?
- java - 使用spring boot starter data jpa批量获取和使用数据
- jquery - JSONP 不能使用来自 API 的结果
- android - Android 使用 c++ 代码导入项目,错误:源文件不是有效的 UTF-8
- node.js - 如何保护节点应用程序源代码?
- reactjs - React-Bootstrap - 卡组件无法导入 & 无法安装对等依赖项
- c# - ConfigurationManager.AppSettings return The given key was not present in the dictionary 错误
- angular - 如何在导出类中将输出声明为整数类型