我的递归方法中的错误

本文关键字:错误 递归方法 我的 | 更新日期: 2023-09-27 17:57:02

我的递归方法有问题。此方法的行为不符合我希望它的行为方式。

我正在尝试做的是获取数据库中所有类别的排序列表,这些列表包含一个名为 ChildList 的子列表,我正在尝试制作一种方法,可以递归地将正确的孩子添加到正确的父级。

在 3 个级别下,它的行为完全符合我想要的,它将一个孩子添加到 CategoryViewModel 的子列表中。 在那之后,它往往会制作我不希望的重复孩子。

例如,你有

根 - 根有电子作为孩子,电子产品小时候有电话,电话有手机,这是我的递归方法复制孩子的地方,制作 2 部手机,如果我在手机下有一个类别 Iphone,它将为每部手机制作 3 个 iPhone 类别的孩子。Iphone类别没有任何子项,列表为0。但我敢打赌,如果有的话,每部iPhone都会有4个该类别的孩子。

这是我的代码

namespace GUI.Controllers
{
public class HomeController : Controller
{
    private readonly IRepository<Category> _repo;
    private static List<CategoryViewModel> _sources;
    public HomeController(IRepository<Category> repo)
    {
        _repo = repo;
    }
    public HomeController()
        : this(new Repository<Category>())
    {
    }
    public ViewResult Index()
   {
       var items = _repo.GetAll().ToList();
       var sortedList = new CategoryViewModel();
       _sources = items.Select(c => new CategoryViewModel
       {
           Id = c.Id,
           Name = c.Name,
           Parent = c.Parent.HasValue ? c.Parent.Value : (Guid?) null,
           Products = c.Product.ToList(),
           ChildList = new List<CategoryViewModel>()
       }).ToList();
       _sources = _sources.OrderBy(o => o.Parent).ToList();
       var root = _sources.First();
       sortedList.Id = root.Id;
       sortedList.Name = root.Name;
       sortedList.Parent = null;
       sortedList.ChildList = _sources.Where(o => o.Parent != null && o.Parent == root.Id).ToList();
       foreach (var l in _sources)
       {
           if(l.Parent == null)
               continue;
           l.ChildList = _sources.Where(o => o.Parent != null && o.Parent == l.Id).ToList();
           if (l.ChildList.Any())
               AddItem(l.ChildList, ref sortedList);
       }
       return View(sortedList);
   }
   private static void AddItem(List<CategoryViewModel> children, ref CategoryViewModel sortedList)
   {
       foreach (var child in children)
       {
          var childs = _sources.Where(o => o.Parent != null && o.Parent == child.Id).ToList();
           foreach (var c in childs)
           {
               child.ChildList.Add(c);
           }
           if (child.ChildList.Any())
               AddItem(child.ChildList, ref sortedList);
       }
   }
}
} 

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using ClassLibrary.Entities;
namespace GUI.Models
{
    public class CategoryViewModel
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string SearchString { get; set; }
        public Guid Id { get; set; }
        public Guid? Parent { get; set; }
        public string ParentName { get; set; }
        public List<Product> Products { get; set; } 
        public List<CategoryViewModel> ChildList { get; set; }
    }
}

我的递归方法中的错误

好的,

我找到了解决问题的方法;

我的递归方法是代码溢出,我太深入了,没有了解如何实际使用递归方法。 正如他们所说; 一件事导致了另一件事,我最终删除了我的 AddItem 方法,事实证明我的 lambda 表达式在正确的列表集合中为我整理了列表; 最终代码现在看起来干净得多,而且小了很多;

public ViewResult Index()
   {
       var items = _repo.GetAll().ToList();
       var categories = items.Select(c => new CategoryViewModel
       {
           Id = c.Id,
           Name = c.Name,
           Parent = c.Parent.HasValue ? c.Parent.Value : (Guid?) null,
           Products = c.Product.ToList(),
           ChildList = new List<CategoryViewModel>()
       }).OrderBy(o => o.Parent).ToList();
      var sortedCategories = categories.First();
      sortedCategories.ChildList = categories.Where(o => o.Parent != null && o.Parent == sortedCategories.Id).ToList();
      foreach (var l in categories.Where(l => l.Parent != null))
      {
          l.ChildList = categories.Where(o => o.Parent != null && o.Parent == l.Id).ToList();
      }
       return View(sortedCategories);
   }