利用委托和泛型实现树的常用操作
在日常开发中,经常遇到对树的操作,我们可以利用泛型和委托对这些树进行操作,这样就不需要每有一个树就要实现相应的功能了。
源码在http://files.cnblogs.com/haiconc/LangTest.zip
首先,使用类泛型声明:
public class TreeOperator<T,K>
在类内声明三个委托
public delegate K GetTreeKey(T tree);//取得树的Key
GetTreeKey GTK;
public delegate K GetParentKey(T tree);//取得树的父节点
GetParentKey GPK;
public delegate bool IsKeyEqual(K keyA, K keyB);//比较Key是否相等
IsKeyEqual IKE;
数据源:
List<T> source;
构造函数:
public int MaxDeep = 100;//防止在递归过程中进入无限死循环
public TreeOperator(GetTreeKey gti, GetParentKey gtp, IsKeyEqual ike , List<T> source, int deep)
{
this.GTK = gti;
this.GPK = gtp;
this.IKE = ike;
this.source = source;
this.MaxDeep = deep;
}
实现第一个功能
/// <summary>
/// 取得从根树到某个树的路径
/// </summary>
/// <param name="tree">某个树</param>
/// <param name="RootTree">根树</param>
/// <returns></returns>
public List<T> GetTreePath(T tree, T RootTree)
{
List<T> list = new List<T>();
T temp = tree;
int i = 0;
while (!IKE(GTK(temp), GTK(RootTree)))
{
list.Add(temp);
temp = GetParentTreeByTree(temp);
/* 防止进入死循环 */
i++;
while (i > MaxDeep)
{
break;
}
}
list.Add(RootTree);
list.Reverse();
return list;
}
private T GetTreeByKey(K key)
{
foreach (T tee in source)
{
if(IKE(GTK(tee),key))
return tee;
}
return default(T);
}
private T GetParentTreeByTree(T tree)
{
K key = GPK(tree);
return GetTreeByKey(key);
}
第二个功能实现:
/// <summary>
/// 取得某个树的所有子孙树
/// </summary>
/// <param name="tree"></param>
/// <param name="source"></param>
/// <returns></returns>
public List<T> GetAllSubTree(T tree)
{
List<T> list = new List<T>();
int deep = 0;
foreach (T tee in source)
{
if(IKE(GPK(tee),GTK(tree)))
{
list.Add(tee);
AddSub(tee, source, list, deep + 1);
}
}
return list;
}
private void AddSub(T tree, List<T> source,List<T> list ,int deep )
{
if (deep > MaxDeep) return;
foreach (T tee in source)
{
if (IKE(GPK(tee), GTK(tree)))
{
list.Add(tee);
AddSub(tee, source, list, deep + 1);
}
}
}
程序匆忙写成,有待改进。
源码在http://files.cnblogs.com/haiconc/LangTest.zip
转载于:https://www.cnblogs.com/haiconc/archive/2012/02/12/2347769.html
利用委托和泛型实现树的常用操作相关推荐
- JavaScript实现树以及对树的常用操作
JS实现树 JavaScript没有树这种结构,使用object以及array实现. const tree = {value:'a',children: [{value'b',children:[]} ...
- 利用委托机制处理.NET中的异常
利用委托机制处理.NET中的异常<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&quo ...
- 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )
文章目录 一.利用注解进行 AST 语法树转换 1.定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 2.AST 转换接口实现 3.定义 Groovy ...
- Python:pmml格式文件的简介、安装、使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略
Python:pmml格式文件的简介.安装.使用方法(利用python将机器学习模型转为Java常用的pmml格式文件)之详细攻略 目录 pmml格式文件的简介 1.PMML结构 pmml安装 pmm ...
- C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
C# 委托 (一)-- 委托. 泛型委托与Lambda表达式 2018年08月19日 20:46:47 wnvalentin 阅读数 2992 版权声明:此文乃博主之原创.鄙人才疏,望大侠斧正.此文可 ...
- 利用委托 实现窗体间通信,非原创
copy自:https://www.cnblogs.com/hugoNB/p/7130562.html,这个作者写的浅显易懂,就复制下来自己看 实现过程: 这里主要是用到委托实现,所以主要描述一下委托 ...
- C#利用委托实现窗体间的值传递
C#利用委托实现窗体间的值传递 A.网上有很多方法,大家可搜一下,都可用. B.这里只是说明下是只利用委托,学习基本的委托运用. 方法如下: 1.C#建立一个默认工程,默认窗体Form1 2.加入一个 ...
- 4.9 利用对应的泛型替换Hashtable[转]
摘要:<C#3.0cookbook中文版><C#3.0cookbook中文版>本书侧重于解决C#程序员在开发应用程序时遇到的各类问题,并以此组织全书内容.这些解决方案称为秘 ...
- .NET利用委托实现动态查询
今天在整理代码的时候发现这个.通过灵活利用委托实现动态(条件)查询. 直接上代码: int articleId = 119; var firstArticle = new ArticleDac().G ...
最新文章
- 语音合成(文字转语音)工具大全
- CTO:再写if-else,逮着一个罚款1000!
- 自学机器学习、深度学习、人工智能的学习资源集合
- android屏幕适配的五种方式_讲一讲Android 9.0系统的新特性,对刘海屏设备进行适配...
- 收不回来的value
- c#多维数组的建立及操作 总结
- selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’解决
- 内存条上面参数详解_为什么买内存条要看时序?别以为内存频率高性能就好
- Inception网络 运行在Cifar10 测试集87.88% Tensorflow 2.1 小白从代码实践中 理解
- JSK-129 判断日期是否符合格式【入门】
- Julia: ...的作用,有意思!
- 最好用的屏幕录像软件,三步实现高清录制?
- golang学习之五:error、painc、recover
- 神武授权位置服务器,太古封魔录神武获得,神武服务器入口
- [生存志] 第74节 孔子集结诗经
- [转] 心态是最大的本钱;人无完人,重要的是怎么做人
- [学习标准库]stdio.h
- 研读Joint Multi-modal Aspect-Sentiment Analysis with Auxiliary Cross-modal
- 武汉计算机考研好的学校排名,武汉排名前十的考研学校
- pycharm PEP8 资料