昨天遇到了一个回复评论的逻辑,评论涉及子级的子级,N级的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();
}
以上有哪里逻辑不明白的可以评论回复,博主会及时回复解答。