You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中统计并获取嵌套树形视图列表?已尝试多方法未成功

嘿,我来帮你搞定这个嵌套树形视图的统计和数据获取问题!这类层级结构的处理,递归或者迭代遍历是最靠谱的方案,我给你两种实用的C#实现方式,你可以按需选用:

方法一:递归遍历(直观易读,适合常规规模的树形结构)

递归是处理树形结构最直观的方式,核心思路就是遍历每个节点,先处理当前节点,再递归处理它的所有子节点。

首先我们先定义通用的树形节点类(你可以根据自己的实际模型调整字段):

public class TreeNode
{
    public int Id { get; set; }
    public string Name { get; set; }
    // 子节点集合,替换成你实际的子节点属性名
    public List<TreeNode> Children { get; set; } = new List<TreeNode>();
}

接下来写统计所有节点数量、以及获取所有节点列表的方法:

// 获取所有节点的列表
public List<TreeNode> GetAllNodes(TreeNode root)
{
    var allNodes = new List<TreeNode>();
    if (root == null) return allNodes;
    
    // 添加当前节点
    allNodes.Add(root);
    // 递归遍历每个子节点,把结果合并进来
    foreach (var child in root.Children)
    {
        allNodes.AddRange(GetAllNodes(child));
    }
    return allNodes;
}

// 统计节点总数
public int CountAllNodes(TreeNode root)
{
    if (root == null) return 0;
    // 当前节点算1,加上所有子节点的数量
    return 1 + root.Children.Sum(child => CountAllNodes(child));
}
方法二:迭代遍历(避免递归栈溢出,适合超大规模树形结构)

如果你的树形结构层级极深(比如几百层),递归可能会触发栈溢出,这时候用迭代(借助栈/队列)就更安全。

这里用栈实现深度优先遍历(和递归逻辑一致):

// 迭代法获取所有节点
public List<TreeNode> GetAllNodesIterative(TreeNode root)
{
    var allNodes = new List<TreeNode>();
    if (root == null) return allNodes;
    
    var stack = new Stack<TreeNode>();
    stack.Push(root);
    
    while (stack.Count > 0)
    {
        var currentNode = stack.Pop();
        allNodes.Add(currentNode);
        
        // 注意:栈是后进先出,所以要倒序推入子节点,才能保持和递归一样的遍历顺序
        foreach (var child in currentNode.Children.Reverse())
        {
            stack.Push(child);
        }
    }
    return allNodes;
}

// 迭代法统计节点总数
public int CountAllNodesIterative(TreeNode root)
{
    int count = 0;
    if (root == null) return count;
    
    var stack = new Stack<TreeNode>();
    stack.Push(root);
    
    while (stack.Count > 0)
    {
        var currentNode = stack.Pop();
        count++;
        
        foreach (var child in currentNode.Children)
        {
            stack.Push(child);
        }
    }
    return count;
}

额外提示

  • 如果你的需求是统计/获取满足特定条件的节点(比如某类名称、某状态的节点),只需要在遍历的时候加判断即可,比如:
    if (currentNode.Name.Contains("目标关键词"))
    {
        allNodes.Add(currentNode);
        // 或者count++
    }
    
  • 记得替换代码中Children字段为你实际树形模型里的子节点属性名(比如SubNodes之类的)。

内容的提问来源于stack exchange,提问作者Sandeep Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:22:37