• 利用委托和泛型实现树的常用操作


    在日常开发中,经常遇到对树的操作,我们可以利用泛型和委托对这些树进行操作,这样就不需要每有一个树就要实现相应的功能了。

    源码在https://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);
                    }
                }
            }
    程序匆忙写成,有待改进。

    源码在https://files.cnblogs.com/haiconc/LangTest.zip

  • 相关阅读:
    golang语言中os/signal包的学习与使用
    golang语言中os/exec包的学习与使用
    go语言使用go-sciter创建桌面应用(七) view对象常用方法,文件选择,窗口弹出,请求
    go语言使用go-sciter创建桌面应用(六) Element元素操作和Event事件响应
    go语言使用go-sciter创建桌面应用(五) 加载元素资源
    go语言使用go-sciter创建桌面应用(四) 固定窗口大小
    go语言使用go-sciter创建桌面应用(三) 事件处理,函数与方法定义,go与tiscript之间相互调用
    go语言使用go-sciter创建桌面应用(二) ui元素查找,增加,删除,修改
    go语言使用go-sciter创建桌面应用(一) 简单的通过html,css写ui
    go语言net包rpc远程调用的使用
  • 原文地址:https://www.cnblogs.com/haiconc/p/2347769.html
Copyright © 2020-2023  润新知