记录转化为有层次结构的树状列表的通用算法

简介:
问题说明:
在获取数据库记录数据的时候, 通常返回的ArrayList集合, 没有了层次关系. 如果每次根据PID重新到数据库获取记录, 可以做到, 但有以下几个缺点:
1. 访问数据库记录次数随着记录的增多而增多
2. 由于需要多次访问数据库, 因此访问速度受影响
3. 需要数据库访问层的支持, 并对记录进行转化, 耦合性太强
4. 通用性不好, 每次需要一个新的类型列表, 就需要重新编写
解决方法:
我根据原有的树状结构算法代码, 编写一个通用的算法, 利用反射原理, 递归的对数据进行筛选.
这样只需要访问数据库一次, 然后就在内存中遍历, 而且适合于所有具有(PID, ID, Name)属性的实体类集合的排序.
 
如我需要生成设备类型实体类集合的树状结构时候, 代码如下:
None.gifArrayList equipTypelist = equipmentType.GetAll();
None.gif    equipTypelist = CollectionHelper.GetTreeItems(equipTypelist);
None.gif     this.ddlEquipmentTypes.DataSource = equipTypelist;
None.gif     this.ddlEquipmentTypes.DataTextField = "Name";
None.gif     this.ddlEquipmentTypes.DataValueField = "ID";
None.gif     this.ddlEquipmentTypes.DataBind();
None.gif
None.gif     this.ddlEquipmentType.Items.Insert(0,  new ListItem("(全部)", "0"));

None.gif     public  class CollectionHelper
ExpandedBlockStart.gif     {            
InBlock.gif        private static ArrayList Fill(int pID, int level, ArrayList list)
ExpandedSubBlockStart.gif        {
InBlock.gif            ArrayList returnList = new ArrayList();
InBlock.gif            foreach(object obj in list)
ExpandedSubBlockStart.gif            {
InBlock.gif                int typePID = (int)ReflectionUtil.GetProperty(obj, "PID");
InBlock.gif                int typeID = (int)ReflectionUtil.GetProperty(obj, "ID");
InBlock.gif                string typeName = ReflectionUtil.GetProperty(obj, "Name") as string;
InBlock.gif
InBlock.gif                if(pID == typePID)
ExpandedSubBlockStart.gif                {
InBlock.gif                    string newName = new string('-', level * 4) + typeName;
InBlock.gif                    ReflectionUtil.SetProperty(obj, "Name", newName);
InBlock.gif                    returnList.Add(obj);
InBlock.gif
InBlock.gif                    returnList.AddRange(Fill(typeID, level+1, list));
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            return returnList;
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gif        /// <summary>
InBlock.gif        
/// 生成有层次结构的列表
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="list">具有Name,ID,PID成员的任何集合</param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif        public static ArrayList GetTreeItems(ArrayList list)
ExpandedSubBlockStart.gif        {
InBlock.gif            return Fill(-1, 0, list);
ExpandedSubBlockEnd.gif        }
    
ExpandedBlockEnd.gif    }

None.gif

None.gif     public  sealed  class ReflectionUtil
ExpandedBlockStart.gif     {
InBlock.gif        private ReflectionUtil()
ExpandedSubBlockStart.gif        { }
InBlock.gif
InBlock.gif        public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public |
InBlock.gif            BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
InBlock.gif
InBlock.gif        public static void SetProperty(object obj, string name, object value)
ExpandedSubBlockStart.gif        {
InBlock.gif            PropertyInfo fi = obj.GetType().GetProperty(name, bf);
InBlock.gif            fi.SetValue(obj, value,null);
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        public static object GetProperty(object obj, string name)
ExpandedSubBlockStart.gif        {
InBlock.gif            PropertyInfo fi = obj.GetType().GetProperty(name, bf);
InBlock.gif            return fi.GetValue(obj,null);
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif}

效果图如下

树状列表效果图.jpg

本文转自博客园伍华聪的博客,原文链接:记录转化为有层次结构的树状列表的通用算法,如需转载请自行联系原博主。



目录
相关文章
|
5月前
|
搜索推荐 算法 Python
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
如何实现归并排序算法? 要求:编写一个Python函数,输入一个无序列表,返回排序后的列表。
|
3月前
|
机器学习/深度学习 人工智能 算法
【动态规划】【组合数学】【C++算法】920播放列表的数量
【动态规划】【组合数学】【C++算法】920播放列表的数量
|
5月前
|
算法 索引 Python
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
如何实现二分查找算法? 要求:编写一个Python函数,输入一个有序列表和一个目标值,返回目标值在列表中的索引。如果目标值不在列表中,返回-1。
|
9月前
|
算法 容器
C++STL算法篇之排序和通用算法
C++STL算法篇之排序和通用算法
|
12月前
|
人工智能 算法
《阿里云产品手册2022-2023 版》——AI通用算法与应用
《阿里云产品手册2022-2023 版》——AI通用算法与应用
182 0
|
12月前
|
算法 Linux iOS开发
Python 源代码里的算法——如何合并多个有序列表并使得结果依然有序?
Python 源代码里的算法——如何合并多个有序列表并使得结果依然有序?
84 0
|
12月前
|
算法 Python
算法题:把列表右侧 k 位数依次移动到左侧
算法题:把列表右侧 k 位数依次移动到左侧
58 0
|
算法 Python
python与算法:python构造整数列表的方法总结并且计算构造效率
python与算法:python构造整数列表的方法总结并且计算构造效率
100 0
python与算法:python构造整数列表的方法总结并且计算构造效率
|
人工智能 缓存 移动开发
通用矩阵乘算法从入门到实践
通用矩阵乘算法从入门到实践
266 0
|
算法 Python
云从科技研究院视觉算法实习技术面试-python题-python列表推导式的使用写法
云从科技研究院视觉算法实习技术面试-python题-python列表推导式的使用写法