C#使用代码实现List的无限层级结构

无限层级这个在一般的项目开发上不会用到,但是例如像博客、论坛的评论或留言,涉及到子级和N+1级的这种逻辑,就要使用到无限层级结构了。

我整理了多层级的两种类型:

第一种:参照CSDN的评论回复方式,只到二级,但是会加上A回复B的逻辑,这样的好处是层级太多,不容易展开来看,直接二级就很简洁;

第二种:根据层级来划分回复子级,也就是一层一层的展开,这样就可以清晰看见谁回复了谁,谁是谁的子级。

第一种的实现思路:使用递归算法求出父级下的所有子级即可;

第二种的实现思路:在得出父级与父级的子级后编写一个层级算法,把相关子级加到对应父级上去;

代码实现(第一种比较简单,这里只贴第二种的代码):

/// <summary>
/// 将实体类转换为层级形式
/// </summary>
/// <param name="limits"></param>
/// <param name="pid"></param>
/// <returns></returns>
public static List<Limit> ToHierarchy(List<Limit> limits, int? pid = 0)
{
List<Limit> newLimitList = new List<Limit>();
newLimitList = limits.Where(t => t.pid == pid).ToList();
for (int i = 0; i < newLimitList.Count; i++)
{
//这里循环调用ToHierarchy方法即是查询父级下的子级,N级下的N+1级,
并添加到子级数据中
newLimitList[i].Limits = ToHierarchy(limits, newLimitList[i].id);//下一层级
}
return newLimitList;
}
public class Limit
{
public int id { get; set; }
public int? pid { get; set; }
public string name { get; set; }
public List<Limit> Limits { get; set; }
}
static void Main(string[] args)
{
List<Limit> limits = new List<Limit>();
limits.Add(new Limit { id = 1, pid = 0, name = "任务管理" });
limits.Add(new Limit { id = 2, pid = 0, name = "任务维护" });
limits.Add(new Limit { id = 3, pid = 1, name = "下载" });
limits.Add(new Limit { id = 4, pid = 3, name = "下载1" });
limits.Add(new Limit { id = 5, pid = 3, name = "下载2" });
var dd = ToHierarchy(limits);
string json = JsonConvert.SerializeObject(dd);
Console.WriteLine(json);
Console.ReadLine();
}

THE END