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);
                    }
                }
            }
        }

 

posted @ 2021-11-25 09:41  <--青青子衿-->  阅读(606)  评论(0)    收藏  举报
// /**/ // 在页脚Html代码 引入 // function btn_donateClick() { var DivPopup = document.getElementById('Div_popup'); var DivMasklayer = document.getElementById('div_masklayer'); DivMasklayer.style.display = 'block'; DivPopup.style.display = 'block'; var h = Div_popup.clientHeight; with (Div_popup.style) { marginTop = -h / 2 + 'px'; } } function MasklayerClick() { var masklayer = document.getElementById('div_masklayer'); var divImg = document.getElementById("Div_popup"); masklayer.style.display = "none"; divImg.style.display = "none"; } setTimeout( function () { document.getElementById('div_masklayer').onclick = MasklayerClick; document.getElementById('btn_donate').onclick = btn_donateClick; var a_gzw = document.getElementById("guanzhuwo"); a_gzw.href = "javascript:void(0);"; $("#guanzhuwo").attr("onclick","follow('33513f9f-ba13-e011-ac81-842b2b196315');"); }, 900);