如何在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ń
相关产品推荐
相关产品推荐

