问题说明: 在获取数据库记录数据的时候, 通常返回的ArrayList集合, 没有了层次关系. 如果每次根据PID重新到数据库获取记录, 可以做到, 但有以下几个缺点:
1. 访问数据库记录次数随着记录的增多而增多
2. 由于需要多次访问数据库, 因此访问速度受影响
3. 需要数据库访问层的支持, 并对记录进行转化, 耦合性太强
4. 通用性不好, 每次需要一个新的类型列表, 就需要重新编写
解决方法: 我根据原有的树状结构算法代码, 编写一个通用的算法, 利用反射原理, 递归的对数据进行筛选.
这样只需要访问数据库一次, 然后就在内存中遍历, 而且适合于所有具有(PID, ID, Name)属性的实体类集合的排序.
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(-1, 0, 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);
}
}效果图如下
专注于代码生成工具、.Net/.NetCore 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架等框架产品。
转载请注明出处:撰写人:伍华聪 http://www.iqidi.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)