.NET C# 树遍历、查询、拷贝与可视化

.NET C# 树遍历、查询、拷贝与可视化

目录

  • .NET C# 树遍历、查询、拷贝与可视化
    • 1 组件安装
      • 1.1 NuGet包管理器安装:
      • 1.2 控制台安装:
    • 2 接口
      • 1.1 ITree\<TTreeNode\>
      • 1.2 ITree\<TKey, TTreeNode\>
      • 1.3 IObservableTree\<TTreeNode\>
      • 1.4 IObservableTree\<TKey, TTreeNode\>
    • 3 方法
      • Clone()
      • Search(Func\<TTreeNode, bool\> expression, bool isClone = false)
      • Traversal(Action\<TTreeNode\> expression)
      • SafeTraversal(Action\<TTreeNode\> expression)
      • Filter(Func\<TTreeNode, bool\> expression)
    • 4 样例源码

树结构组件,支持查询、遍历、拷贝、可视树过滤(不改变树结构,只过滤显示效果)

1 组件安装

1.1 NuGet包管理器安装:

image-20240625110819315

1.2 控制台安装:

NuGet\Install-Package Zhy.Components.Tree -Version 1.0.3
NuGet\Install-Package Zhy.Components.Tree.Extension -Version 1.0.3

2 接口

1.1 ITree<TTreeNode>

public class TestTree : ITree<TestTree>
{public string Id { get; set; }public string Name { get; set; }public TestTree Parent { get; set; }public List<TestTree> Children { get; set; }public TestTree(string id, string name, TestTree parent, List<TestTree> children){Id = id;Name = name;Parent = parent;Children = children;}public TestTree Clone(){var childListClone = new List<TestTree>();if (Children != null){foreach (var child in Children){var childClone = child.Clone();childClone.Parent = this;childListClone.Add(childClone);}}return new TestTree(Id, Name, null, childListClone);}
}

1.2 ITree<TKey, TTreeNode>

public class TestTree2 : ITree<string, TestTree2>
{public string Id { get; set; }public string Name { get; set; }public string Key { get; set; }public string PKey { get => Parent?.Key; }public TestTree2 Parent { get; set; }public List<TestTree2> Children { get; set; }public TestTree2 this[string key]{get => Children.First(x => x.Key == key);set {TestTree2 node = Children.First(x => x.Key == key);int idx = Children.IndexOf(node);Children[idx] = value;}}public TestTree2(string id, string name, string key, TestTree2 parent, List<TestTree2> children){Id = id;Name = name;Key = key;Parent = parent;Children = children;}public TestTree2 Clone(){var childListClone = new List<TestTree2>();if (Children != null){foreach (var child in Children){var childClone = child.Clone();childClone.Parent = this;childListClone.Add(childClone);}}return new TestTree2(Id, Name, Key, null, childListClone);}
}

1.3 IObservableTree<TTreeNode>

public class TestTree : ITree<TestTree>
{public string Id { get; set; }public string Name { get; set; }public TestTree Parent { get; set; }public List<TestTree> Children { get; set; }public TestTree(string id, string name, TestTree parent, List<TestTree> children){Id = id;Name = name;Parent = parent;Children = children;}public TestTree Clone(){var childListClone = new List<TestTree>();if (Children != null){foreach (var child in Children){var childClone = child.Clone();childClone.Parent = this;childListClone.Add(childClone);}}return new TestTree(Id, Name, null, childListClone);}
}

1.4 IObservableTree<TKey, TTreeNode>

public class TestTree2 : ITree<string, TestTree2>
{public string Id { get; set; }public string Name { get; set; }public string Key { get; set; }public string PKey { get => Parent?.Key; }public TestTree2 Parent { get; set; }public List<TestTree2> Children { get; set; }public TestTree2 this[string key]{get => Children.First(x => x.Key == key);set{TestTree2 node = Children.First(x => x.Key == key);int idx = Children.IndexOf(node);Children[idx] = value;}}public TestTree2(string id, string name, string key, TestTree2 parent, List<TestTree2> children){Id = id;Name = name;Key = key;Parent = parent;Children = children;}public TestTree2 Clone(){var childListClone = new List<TestTree2>();if (Children != null){foreach (var child in Children){var childClone = child.Clone();childClone.Parent = this;childListClone.Add(childClone);}}return new TestTree2(Id, Name, Key, null, childListClone);}
}

3 方法

Clone()

深拷贝方法,继承接口时实现。

TestTree testTree = new TestTree("0", "root", null, new List<TestTree>());
TestTree testTreeClone = testTree.Clone();

Search(Func<TTreeNode, bool> expression, bool isClone = false)

树查询方法。

expression: 委托,参数为树节点,返回值为True/False,表示节点是否符合查询规则;

isClone: 是否克隆新的对象,True - 在新的树上进行查询及修改,并返回新的树,False - 在原始树上进行查询及修改;

TestTree searchResult = testTree.Search(node => node.Name.StartsWith("vect"), true);

Traversal(Action<TTreeNode> expression)

树遍历方法。

expression: 委托,参数为树节点,遍历所有节点执行;

testTree.Traversal(node => Console.WriteLine(node.Name));

SafeTraversal(Action<TTreeNode> expression)

安全的树遍历,若遍历时对树节点结构进行修改时使用。

testTree.SafeTraversal(node =>
{if (node.Name.EndsWith("1")){node.Parent.Children.Remove(node);}
});

Filter(Func<TTreeNode, bool> expression)

可视树过滤,不改变树结构,只影响树结构的可视化显示。

expression: 委托,参数为树节点,返回值为True/False,表示节点是否符合过滤规则;

testTree.Filter(n => n.Name.Contains(SearchText));

Zhy.Components.ObservableTree.Filter

4 样例源码

TestTreeNode.cs

using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;namespace Zhy.Components.Tree.Test
{public partial class TestTreeNode : ObservableObject, IObservableTree<TestTreeNode>{public TestTreeNode Parent { get; set; }[ObservableProperty]private string _name;[ObservableProperty]private ObservableCollection<TestTreeNode> _children;//public ObservableCollection<TestTreeNode> Children //{//    get => _children;//    set => SetProperty(ref _children, value);//}public TestTreeNode Clone(){TestTreeNode clone = new TestTreeNode{Name = _name,};if (Children?.Count > 0){clone.Children = new ObservableCollection<TestTreeNode>();foreach (var child in Children){TestTreeNode subClone = child.Clone();subClone.Parent = this;clone.Children.Add(subClone);}}return clone;}}
}

MainWindow.xaml

<Grid Margin="10"><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition /></Grid.RowDefinitions><DockPanel><ButtonCommand="{Binding SearchCommand}"Content="查  询"Cursor="Hand"DockPanel.Dock="Right" /><TextBox Text="{Binding SearchText}" /></DockPanel><TreeViewGrid.Row="1"HorizontalContentAlignment="Stretch"VerticalContentAlignment="Stretch"ItemsSource="{Binding TreeNodes}"><TreeView.ItemContainerStyle><Style TargetType="TreeViewItem"><Setter Property="IsExpanded" Value="True" /></Style></TreeView.ItemContainerStyle><TreeView.ItemTemplate><HierarchicalDataTemplate ItemsSource="{Binding Children}"><DockPanel x:Name="dp" Margin="0,2,0,2"><TextBlockVerticalAlignment="Center"FontSize="14"IsHitTestVisible="True"Text="{Binding Name}" /><TextBlock IsHitTestVisible="True" /></DockPanel></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView>
</Grid>

MainWindowViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using Zhy.Components.Tree.Extension;namespace Zhy.Components.Tree.Test
{public partial class MainWindowViewModel : ObservableObject{[ObservableProperty]private ObservableCollection<TestTreeNode> _treeNodes;[ObservableProperty]private string _searchText;public MainWindowViewModel(){_treeNodes = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "资源目录",Children = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "矢量",Children = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "行政区划",Children = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "北京行政区划"},new TestTreeNode{Name = "天津行政区划"},new TestTreeNode{Name = "河北行政区划"},}},new TestTreeNode{Name = "管线",}}},new TestTreeNode{Name = "栅格",Children = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "正射影像",Children = new ObservableCollection<TestTreeNode>{new TestTreeNode{Name = "北京遥感影像"},new TestTreeNode{Name = "天津遥感影像"},new TestTreeNode{Name = "河北遥感影像"},}},new TestTreeNode{Name = "DEM"}}}}},};}[RelayCommand]private void Search(){foreach (var item in TreeNodes){item.Filter(n => n.Name.Contains(SearchText));}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第7天 | 模型训练

内容介绍&#xff1a; 模型训练一般分为四个步骤&#xff1a; 1. 构建数据集。 2. 定义神经网络模型。 3. 定义超参、损失函数及优化器。 4. 输入数据集进行训练与评估。 具体内容&#xff1a; 1. 导包 import mindspore from mindspore import nn from mindspore.dataset…

手把手教你使用kimi创建流程图【实践篇】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 引言 在昨日的文章中&#xff0c;我们介绍了如何使用Kimi生成论文中的流程图。今天&#xff0c;我们将更进一步&#xff0c;通过实践案例来展示Kimi在生成流程图方面的应用。这不仅将加…

【大数据技术原理与应用(概念、存储、处理、分析与应用)】第1章-大数据概述习题与知识点回顾

文章目录 单选题多选题知识点回顾几次信息化浪潮主要解决什么问题&#xff1f;信息科技为大数据时代提供哪些技术支撑&#xff1f;数据产生方式有哪些变革&#xff1f;大数据的发展历程大数据的四个特点&#xff08;4V&#xff09;大数据对思维方式的影响大数据有哪些关键技术&…

软考《信息系统运行管理员》-1.2信息系统运维

1.2信息系统运维 传统运维模式&#xff08;软件&#xff09; 泛化&#xff1a;软件交付后围绕其所做的任何工作纠错&#xff1a;软件运行中错误的发现和改正适应&#xff1a;为适应环境做出的改变用户支持&#xff1a;为软件用户提供的支持 新的不同视角下的运维 “管理”的…

Java 面试指南合集

线程篇 springBoot篇 待更新 黑夜无论怎样悠长&#xff0c;白昼总会到来。 此文会一直更新哈 如果你希望成功&#xff0c;当以恒心为良友&#xff0c;以经验为参谋&#xff0c;以当心为兄弟&#xff0c;以希望为哨兵。

拉普拉斯变换与卷积

前面描述 卷积&#xff0c;本文由卷积引入拉普拉斯变换。 拉普拉斯变换就是给傅里叶变换的 iωt 加了个实部&#xff0c;也可以反着理解&#xff0c;原函数乘以 e − β t e^{-\beta t} e−βt 再做傅里叶变换&#xff0c;本质上都是傅里叶变换的扩展。 加入实部的拉普拉斯变…

【建设方案】智慧园区大数据云平台建设方案(DOC原件)

大数据云平台建设技术要点主要包括以下几个方面&#xff1a; 云计算平台选择&#xff1a;选择安全性高、效率性强、成本可控的云计算平台&#xff0c;如阿里云、腾讯云等&#xff0c;确保大数据处理的基础环境稳定可靠。 数据存储与管理&#xff1a;利用Hadoop、HBase等分布式…

一年Java转GO|19K|腾讯 CSIG 一二面经

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 背景 学历&#xff1a;本科工作经验&#xff1a;一年(不算实习)当前语言&#xff1a;Javabase&#xff1a;武汉部门\岗位&#xff1a;腾讯云‍ 一…

5000天后的世界:科技引领的未来之路

**你是否想过&#xff0c;5000天后的世界会是什么样子&#xff1f;** 科技日新月异&#xff0c;改变着我们的生活方式&#xff0c;也引领着人类文明的进程。著名科技思想家凯文凯利在他的著作《5000天后的世界》中&#xff0c;对未来进行了大胆的预测。 **这本书中&#xff0c…

基于微信小程序的在线点餐系统【前后台+附源码+LW】

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 点餐小程序&#xff0c;主要的模块包括实现管理员&#xff1b;管理员用户&#xff0c;可以对整个系统进行基本的增删改查&#xff0c;系统的日…

Opencv+python模板匹配

我们经常玩匹配图像或者找相似&#xff0c;opencv可以很好实现这个简单的小功能。 模板是被查找目标的图像&#xff0c;查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法&#xff0c;其语法如下&#xff1a; result cv2.…

使用go语言来完成复杂excel表的导出导入

使用go语言来完成复杂excel表的导出导入&#xff08;一&#xff09; 1.复杂表的导入 开发需求是需要在功能页面上开发一个excel文件的导入导出功能&#xff0c;这里的复杂指定是表内数据夹杂着一对多&#xff0c;多对一的形式&#xff0c;如下图所示。数据杂乱而且对应不统一。…

中国90米分辨率可蚀性因子K数据

土壤可蚀性因子&#xff08;K&#xff09;数据&#xff0c;基于多种土壤属性数据计算&#xff0c;所用数据包括土壤黏粒含量&#xff08;%&#xff09;、粉粒含量&#xff08;%&#xff09;、砂粒含量&#xff08;%&#xff09;、土壤有机碳含量&#xff08;g/kg&#xff09;、…

[DALL·E 2] Hierarchical Text-Conditional Image Generation with CLIP Latents

1、目的 CLIP DDPM进行text-to-image生成 2、数据 (x, y)&#xff0c;x为图像&#xff0c;y为相应的captions&#xff1b;设定和为CLIP的image和text embeddings 3、方法 1&#xff09;CLIP 学习图像和文本的embedding&#xff1b;在训练prior和decoder时固定该部分参数 2&a…

开放式耳机什么牌子好一点?亲检的几款开放式蓝牙耳机推荐

不入耳的开放式耳机更好一些&#xff0c;不入耳式耳机佩戴更舒适&#xff0c;适合长时间佩戴&#xff0c;不会引起强烈的压迫感或耳部不适。不入耳式的设计不需要接触耳朵&#xff0c;比入耳式耳机更加卫生且不挑耳型&#xff0c;因此备受运动爱好者和音乐爱好者的喜爱。这里给…

周转车配料拣货方案

根据周转车安装的电子标签&#xff0c;被悬挂的扫码器扫到墨水屏显示的二维码&#xff0c;投屏发送配料拣货的数据。 方便快捷分拣物料

20240625(周二)欧美股市总结:标普纳指止步三日连跌,英伟达反弹6.8%,谷歌微软新高,油价跌1%

美联储理事鲍曼鹰派发声&#xff0c;若通胀没有持续改善将支持加息&#xff0c;加拿大5月CPI重新加速&#xff0c;对加拿大央行7月降息构成阻碍。美股走势分化&#xff0c;道指收跌近300点且六日里首跌&#xff0c;英伟达市值重上3.10万亿美元&#xff0c;芯片股指显著反弹1.8%…

想要用tween实现相机的移动,three.js渲染的canvas画布上相机位置一点没动,如何解决??

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

第1章 物联网模式简介---独特要求和体系结构原则

物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外&#xff0c;物联网实施的固有复杂性&#xff08;一端的现场设备在计算上受到挑战&#xff0c;另一端的云容量几乎无限&#xff09;迫使架构师做出艰难的架构决策和实施选择。可用实现技…

【自动调参】年化29.3%,最大回撤18.5%​:lightGBM的参数优化

原创文章第570篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 研报复现继续&#xff1a;【研报复现】年化27.1%&#xff0c;人工智能多因子大类资产配置策略之benchmark 昨天调了一版参数&#xff0c;主要是lambda_l1, lambda_l2&#xff0c;防…