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

如何在C#中从对象列表高效生成并展示TreeView

高效构建层级TreeView的实现方案

一、修正自定义类与数据集合(避免命名冲突)

先将原代码中的Object类重命名为MyObject,补充正确的构造函数以支持可选的C属性:

public class MyObject
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    public MyObject(string a, string b, string c = null)
    {
        A = a;
        B = b;
        C = c;
    }
}

修正语法错误后的数据集合初始化:

var dataList = new List<MyObject>
{
    new MyObject("a1","b1","c1"),
    new MyObject("a1","b2","c2"),
    new MyObject("a1","b2","c3"),
    new MyObject("a2","b3","c4"),
    new MyObject("a2","b4","c5"),
    new MyObject("a3","b5"),
    new MyObject("a3","b6","c6")
};

二、核心高效分组逻辑

利用LINQ的GroupBy进行单次遍历分组,直接将数据组织成A→B→C的层级结构,时间复杂度为O(n),远优于拆分多列表反复查找的方案:

var groupedData = dataList.GroupBy(item => item.A)
                          .Select(aGroup => new 
                          {
                              AValue = aGroup.Key,
                              BGroups = aGroup.GroupBy(item => item.B)
                          });

三、WinForms TreeView 实现

基于分组结果直接创建节点,无需额外查找操作,避免冗余开销:

// 清空现有节点
treeView1.Nodes.Clear();

foreach (var aGroup in groupedData)
{
    // 创建A级根节点
    var aNode = treeView1.Nodes.Add(aGroup.AValue);
    
    foreach (var bGroup in aGroup.BGroups)
    {
        // 创建B级子节点
        var bNode = aNode.Nodes.Add(bGroup.Key);
        
        // 仅当C属性非空时,添加C级节点
        foreach (var item in bGroup)
        {
            if (!string.IsNullOrEmpty(item.C))
            {
                bNode.Nodes.Add(item.C);
            }
        }
    }
}

四、WPF TreeView 实现(数据绑定方式)

WPF推荐使用分层数据模型+数据绑定,性能更优,适合大数据量场景:

1. 创建层级数据模型

public class ANode
{
    public string Name { get; set; }
    public List<BNode> BNodes { get; set; } = new List<BNode>();
}

public class BNode
{
    public string Name { get; set; }
    public List<string> CNodes { get; set; } = new List<string>();
}

2. 转换为分层数据

var treeData = dataList.GroupBy(item => item.A)
                       .Select(aGroup => new ANode
                       {
                           Name = aGroup.Key,
                           BNodes = aGroup.GroupBy(item => item.B)
                                         .Select(bGroup => new BNode
                                         {
                                             Name = bGroup.Key,
                                             CNodes = bGroup.Where(item => !string.IsNullOrEmpty(item.C))
                                                             .Select(item => item.C)
                                                             .ToList()
                                         })
                                         .ToList()
                       })
                       .ToList();

3. XAML绑定配置

<TreeView ItemsSource="{Binding TreeData}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding BNodes}">
            <TextBlock Text="{Binding Name}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding CNodes}">
                    <TextBlock Text="{Binding}" />
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

方案优势

  • 仅需一次遍历原始集合完成分组,处理1000+条数据无性能压力;
  • 基于分组结果直接创建节点/绑定数据,避免了反复查找节点的冗余操作;
  • 逻辑清晰,代码简洁,可维护性高。

内容的提问来源于stack exchange,提问作者Łukasz Kaproń

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:51