zoukankan      html  css  js  c++  java
  • 记录转化为有层次结构的树状列表的通用算法

     

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

        
    this.ddlEquipmentType.Items.Insert(0new ListItem("(全部)""0"));

        public class CollectionHelper
        
    {            
            
    private static ArrayList Fill(int pID, int level, ArrayList list)
            
    {
                ArrayList returnList 
    = new ArrayList();
                
    foreach(object obj in list)
                
    {
                    
    int typePID = (int)ReflectionUtil.GetProperty(obj, "PID");
                    
    int typeID = (int)ReflectionUtil.GetProperty(obj, "ID");
                    
    string typeName = ReflectionUtil.GetProperty(obj, "Name"as string;

                    
    if(pID == typePID)
                    
    {
                        
    string newName = new string('-', level * 4+ typeName;
                        ReflectionUtil.SetProperty(obj, 
    "Name", newName);
                        returnList.Add(obj);

                        returnList.AddRange(Fill(typeID, level
    +1, list));
                    }

                }

                
    return returnList;
            }


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

            public static ArrayList GetTreeItems(ArrayList list)
            
    {
                
    return Fill(-10, list);
            }
        
        }


        public sealed class ReflectionUtil
        
    {
            
    private ReflectionUtil()
            
    { }

            
    public static BindingFlags bf = BindingFlags.DeclaredOnly | BindingFlags.Public |
                BindingFlags.NonPublic 
    | BindingFlags.Instance | BindingFlags.Static;

            
    public static void SetProperty(object obj, string name, object value)
            
    {
                PropertyInfo fi 
    = obj.GetType().GetProperty(name, bf);
                fi.SetValue(obj, value,
    null);
            }


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

    }

    效果图如下
    树状列表效果图.jpg
  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/973765.html
Copyright © 2011-2022 走看看