我的递归方法中的错误
本文关键字:错误 递归方法 我的 | 更新日期: 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);
}