.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.pswp.cn/diannao/35459.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35459.shtml
英文地址,請注明出處:http://en.pswp.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;大數據對思維方式的影響大數據有哪些關鍵技術&…

burpsuite 抓https的方法(CA證書操作)

https://cloud.tencent.com/developer/article/1391501

軟考《信息系統運行管理員》-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;系統的日…

什么是<meta> 標簽

<meta> 標簽是 HTML 文檔頭部 (<head>) 中的一種元數據標簽&#xff0c;用于提供關于 HTML 文檔的信息。雖然它不會直接影響文檔的呈現&#xff0c;但它在搜索引擎優化 (SEO)、瀏覽器行為和文檔元信息方面起著重要作用。以下是一些常見的 <meta> 標簽及其用途…

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;因此備受運動愛好者和音樂愛好者的喜愛。這里給…

MySQL中ALTER LOGFILE GROUP 語句詳解

在 MySQL 的 InnoDB 存儲引擎中&#xff0c;ALTER LOGFILE GROUP 語句用于修改重做日志組&#xff08;redo log group&#xff09;的配置。重做日志是 InnoDB 用來保證事務持久性的一個關鍵組件&#xff0c;它們用于在系統崩潰后恢復數據。 InnoDB 支持多個重做日志組&#xf…

周轉車配料揀貨方案

根據周轉車安裝的電子標簽&#xff0c;被懸掛的掃碼器掃到墨水屏顯示的二維碼&#xff0c;投屏發送配料揀貨的數據。 方便快捷分揀物料

20240625(周二)歐美股市總結:標普納指止步三日連跌,英偉達反彈6.8%,谷歌微軟新高,油價跌1%

美聯儲理事鮑曼鷹派發聲&#xff0c;若通脹沒有持續改善將支持加息&#xff0c;加拿大5月CPI重新加速&#xff0c;對加拿大央行7月降息構成阻礙。美股走勢分化&#xff0c;道指收跌近300點且六日里首跌&#xff0c;英偉達市值重上3.10萬億美元&#xff0c;芯片股指顯著反彈1.8%…