zoukankan      html  css  js  c++  java
  • 利用委托和泛型实现树的常用操作

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

    源码在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

  • 相关阅读:
    C# 时间格式化
    下载好证书后,手机无法安装fiddler证书
    charles抓包步骤整理
    Windows 8的本地化应用程序清单
    代码滑动panorama-即程序中设置SelectedIndex
    WP7开发 Sqlite数据库的使用 解决Unable open the database
    mybatis plus eq and or
    弹出窗口
    父子窗口传递参数
    从后台数据库查询的List数据怎么在前台combobox显示
  • 原文地址:https://www.cnblogs.com/haiconc/p/2347769.html
Copyright © 2011-2022 走看看