gpt4 book ai didi

c# - 具有深度的递归层次连接

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:11 24 4
gpt4 key购买 nike

我关注了这个Recursive Hierarchical Joins in C# and LINQ发布以实现递归连接扩展以在我的应用程序中显示 TreeView 数据。因为我有 15000 个树节点,jQuery DynaTree在有问题的浏览器 I.E 7 和 8 中,客户端准备工作需要花费大量时间(50 秒)

为了避免这种情况,我决定一开始只加载一个级别,然后按需加载其他子级别(延迟加载)。

但我看不到在递归连接中设置深度的效果。即使我指定,它也会准备所有节点。

public static List<DynaTreeNode> GenerateTreeByDepth(List<NodeDTO> nodeList, 
int deepLevel)
{

StringBuilder hirTree = new StringBuilder();
List<DynaTreeNode> tree = new List<DynaTreeNode>();

IEnumerable<DynaTreeNode> nodes = nodeList.RecursiveJoin
(element => element.DataPointSK,element => element.DataPointSKParent,
(NodeDTO element, int index, int depth,IEnumerable<DynaTreeNode> childNodes) =>
new DynaTreeNode()
{
title = element.DataPoint,
key = element.DataPointSK.ToString(),
children = childNodes.ToList(),
select = element.selected,
expand = element.selected,
Depth = deepLevel
});
tree = nodes.ToList();
return tree;

}

我试过设置深度

Depth = deepLevel

但是没有用。可能是什么问题?我怎样才能做到这一点?

最佳答案

RecursiveJoin 扩展方法用于从原始节点构建树。您正在使用的重载传递了 int depth 参数,用于初始化新创建的节点及其所在的级别,并且与构建的树的深度无关。

扩展本身是惰性的。当您第一次调用 RecursiveJoin 时,它将返回根的 IEnumerable<>,直到您开始枚举时才会具体化。

您的代码的问题在于您急切地将子项的 IEnumerable<> 转换为列表:

children = childNodes.ToList()

这会强制子集合的具体化,再次递归调用相同的方法来构造 DynaTreeNode,并在所有级别重复。尝试用 IEnumerable 替换 DynaTreeNode 中的子列表 - 这将按需生成 DynaTreeNode。

或者您可以保留列表,并将上面的行替换为以下代码:

chidren = depth >= deepLevel ? null : childNodes.ToList()

这将按照预期在通过的级别切断树。

关于c# - 具有深度的递归层次连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com