C#递归算法
一、单根树递归
public IEnumerable<CTreeViewDto> GetNodes(CTreeViewQueryDto queryDto)
{
var models = new List<CTreeViewDto>();
var model = GetTree(GetAll(queryDto));
models.Add(model);
return models;
}
/// <summary>
/// 获取树形结构数据
/// </summary>
private CTreeViewDto GetTree(IEnumerable<CTreeViewDto> list)
{
var root = new CTreeViewDto();
foreach (var item in list)
{
if (item.Id == 0)
{
root = item;
}
else
{
RecursionTree(root, item);
}
}
return root;
}
/// <summary>
/// 递归树
/// </summary>
private void RecursionTree(CTreeViewDto node, CTreeViewDto item)
{
//原来的递归方法,有bug,ChildNodes为null时会报错;
//if (item.PId == node.Id && !node.ChildNodes.Contains(item))
//{
// item.Parent = node;
// node.ChildNodes.Add(item);
//}
//else
//{
// foreach (var childNodeL0 in node.ChildNodes)
// {
// RecursionTree(childNodeL0, item);
// }
//}
//优化后的递归方法,执行ChildNodes为null的情况--201910211236
if (node.ChildNodes == null)
{
if (item.PId == node.Id)
{
node.ChildNodes = new List<CTreeViewDto>();
item.Parent = node;
node.ChildNodes.Add(item);
}
}
else
{
if (item.PId == node.Id && !node.ChildNodes.Contains(item))
{
item.Parent = node;
node.ChildNodes.Add(item);
}
else
{
foreach (var childNodeL0 in node.ChildNodes)
{
RecursionTree(childNodeL0, item);
}
}
}
}
#endregion
二、多根数递归
public async Task<IEnumerable<ExamClassOrderTreeModel>> GetTreeNodes(string hospitalCode, string langCode = "zh-CN")
{
var dicDto = await _dicApi.GetAllExamClassOrdersAsync();
if (dicDto.Success && dicDto.Data != null)
{
var trees = GetTrees(dicDto.Data);
if (trees != null && trees.Count > 0)
{
var nodes = new List<ExamClassOrderTreeModel>();
trees.ForEach(x => nodes.Add(x.MapTo<ExamClassOrderTreeModel>()));
return nodes;
}
}
return null;
}
/// <summary>
/// 获取多根树形结构数据
/// </summary>
private List<ExamClassWithOrderDto> GetTrees(IEnumerable<ExamClassWithOrderDto> list)
{
var roots = new List<ExamClassWithOrderDto>();
foreach (var item in list)
{
if (item.ExamParentClassCode == null)//根
{
roots.Add(item);
}
else
{
var node = list.ToList().Where(x => x.Id == item.ExamParentClassCode).FirstOrDefault();
RecursionTrees(node, item);
}
}
return roots;
}
/// <summary>
/// 递归多根树
/// </summary>
private void RecursionTrees(ExamClassWithOrderDto parentNode, ExamClassWithOrderDto item)
{
if (parentNode.ChildNodes == null)
{
if (item.ExamParentClassCode == parentNode.Id)
{
parentNode.ChildNodes = new List<ExamClassWithOrderDto>();
item.ParentNode = parentNode;
parentNode.ChildNodes.Add(item);
}
}
else
{
if (item.ExamParentClassCode == parentNode.Id && !parentNode.ChildNodes.Contains(item))
{
item.ParentNode = parentNode;
parentNode.ChildNodes.Add(item);
}
else
{
foreach (var childNodeL0 in parentNode.ChildNodes)
{
RecursionTrees(childNodeL0, item);
}
}
}
}

您的资助是我最大的动力!
金额随意,欢迎来赏!

我写的东西能让你能懂,那是义务
毕竟占用了你生命中的宝贵的时间和注意力
要是你还能喜欢我的作品,那就是缘分了
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【青青子衿】!