C# 如何递归地获取类别及其子类别';子类别
我正试图绘制我的网站地图如下C# 如何递归地获取类别及其子类别';子类别,c#,asp.net-mvc,recursion,C#,Asp.net Mvc,Recursion,我正试图绘制我的网站地图如下 <ul> <li>Cat1</li> <li>Cat2 <ul class='sub2'> <li>Cat21</li> <li>Cat
<ul>
<li>Cat1</li>
<li>Cat2
<ul class='sub2'>
<li>Cat21</li>
<li>Cat22</li>
<li>Cat23
<ul class='sub23'>
<li>Cat231</li>
<li>Cat232</li>
<li>Cat233
<ul class='sub233'>
<li>Cat2331</li>
<li>Cat2332</li>
<li>Cat2333</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>Cat3
<ul class='sub3'>
<li>Cat31</li>
<li>Cat32</li>
<li>Cat33</li>
</ul>
</li>
<li>Cat4</li>
</ul>
我写了一些东西,但它对子类别的子类别不起递归作用:例如:它对sub2起作用,但对sub23、sub332、sub
这是我的分类mapviewmodel类
public class CategoryMapViewModel
{
public HtmlString Map { get; private set; }
private List<int?> TakenIds = new List<int?>();
public CategoryMapViewModel(List<PostCategoryModels> categoriesModels)
{
string map = "";
map = BuildCategoriesMap(categoriesModels, map);
this.Map = new HtmlString(map);
}
private string BuildCategoriesMap(List<PostCategoryModels> categories, string map)
{
if (categories != null && categories.Count > 0)
{
map += "<ul>";
foreach (PostCategoryModels cat in categories)
{
if ((!cat.CategoryId.HasValue) || (cat.CategoryId.HasValue && (!TakenIds.Contains(cat.CategoryId))))
{
map += "<li>" + cat.Name;
List<PostCategoryModels> subCats = categories.Where(c => c.IdPostCategoryParent == cat.CategoryId).ToList();
if (subCats.Count() > 0)
{
//map += BuildCategoriesMap(subCats, map);
//BuildCategoriesMap(subCats, map);
map += BuildCategoriesMap(subCats, "");
}
map += "</li>";
}
TakenIds.Add(cat.CategoryId);
}
map += "</ul>";
}
return map;
}
}
public类CategoryMapViewModel
{
公共HtmlString映射{get;private set;}
私有列表TakenIds=新列表();
公共类别mapviewmodel(列表类别模型)
{
字符串map=“”;
map=BuildCategoriesMap(categoriesModels,map);
this.Map=newhtmlstring(Map);
}
私有字符串BuildCategoriesMap(列表类别、字符串映射)
{
if(categories!=null&&categories.Count>0)
{
map+=“”;
foreach(分类中的后分类模型)
{
如果(!cat.CategoryId.HasValue)| |(cat.CategoryId.HasValue&&(!TakenIds.Contains(cat.CategoryId)))
{
map+=“- ”+类别名称;
列出子类别=类别。其中(c=>c.IdPostCategoryParent==cat.CategoryId.ToList();
如果(子类别计数()>0)
{
//map+=BuildCategoriesMap(子类别,映射);
//BuildCategoriesMap(子类别、地图);
map+=BuildCategoriesMap(子类别“”);
}
map+=“
”;
}
添加(类别ID);
}
map+=“
”;
}
返回图;
}
}
我错了吗?有人能给我最好最简单的方法吗?如果是,请做!
亲切的问候 问题是您正在类别中搜索子类别,但在处理直接子类别时,您只传递直接子类别,因此当它搜索子类别时,没有匹配的子类别 一种解决方案是在类中保留对类别的引用,并在搜索子类别时使用该引用 即:
public类CategoryMapViewModel
{
公共HtmlString映射{get;private set;}
私有列表TakenIds=新列表();
私人名单(类别),;
公共类别mapviewmodel(列表类别模型)
{
_类别=类别模型??新列表();
字符串映射=BuildCategoriesMap(_categories);
this.Map=newhtmlstring(Map);
}
私有字符串BuildCategoriesMap(列出类别)
{
var-map=“”;
如果(categories.Count>0)
{
map+=“”;
foreach(分类中的后分类模型)
{
如果(!cat.CategoryId.HasValue)| |(cat.CategoryId.HasValue&&(!TakenIds.Contains(cat.CategoryId)))
{
map+=“- ”+类别名称;
列出子类别=_categories.Where(c=>c.IdPostCategoryParent==cat.CategoryId.ToList();
地图+=建筑分类地图(子类别);
map+=“
”;
}
添加(类别ID);
}
map+=“
”;
}
返回图;
}
}
我还删除了一些多余的线路youuuupiiii!!!!是的,是的!!!!谢谢你,现在一切都好了谢谢你,马丁
public class PostCategory{
[Key]
public int? CategoryId{get;set;}
[StringLength(20/*50*/,MinimumLength=3)]
public string Name{get;set;}
[StringLength(250)]
public string Description { get; set; }
//relationship
public int? IdPostCategoryParent { get; set; }
}
public class CategoryMapViewModel
{
public HtmlString Map { get; private set; }
private List<int?> TakenIds = new List<int?>();
public CategoryMapViewModel(List<PostCategoryModels> categoriesModels)
{
string map = "";
map = BuildCategoriesMap(categoriesModels, map);
this.Map = new HtmlString(map);
}
private string BuildCategoriesMap(List<PostCategoryModels> categories, string map)
{
if (categories != null && categories.Count > 0)
{
map += "<ul>";
foreach (PostCategoryModels cat in categories)
{
if ((!cat.CategoryId.HasValue) || (cat.CategoryId.HasValue && (!TakenIds.Contains(cat.CategoryId))))
{
map += "<li>" + cat.Name;
List<PostCategoryModels> subCats = categories.Where(c => c.IdPostCategoryParent == cat.CategoryId).ToList();
if (subCats.Count() > 0)
{
//map += BuildCategoriesMap(subCats, map);
//BuildCategoriesMap(subCats, map);
map += BuildCategoriesMap(subCats, "");
}
map += "</li>";
}
TakenIds.Add(cat.CategoryId);
}
map += "</ul>";
}
return map;
}
}
public class CategoryMapViewModel
{
public HtmlString Map { get; private set; }
private List<int?> TakenIds = new List<int?>();
private List<PostCategoryModels> _categories;
public CategoryMapViewModel(List<PostCategoryModels> categoriesModels)
{
_categories = categoriesModels ?? new List<PostCategoryModels>();
string map = BuildCategoriesMap(_categories);
this.Map = new HtmlString(map);
}
private string BuildCategoriesMap(List<PostCategoryModels> categories)
{
var map = "";
if (categories.Count > 0)
{
map += "<ul>";
foreach (PostCategoryModels cat in categories)
{
if ((!cat.CategoryId.HasValue) || (cat.CategoryId.HasValue && (!TakenIds.Contains(cat.CategoryId))))
{
map += "<li>" + cat.Name;
List<PostCategoryModels> subCats = _categories.Where(c => c.IdPostCategoryParent == cat.CategoryId).ToList();
map += BuildCategoriesMap(subCats);
map += "</li>";
}
TakenIds.Add(cat.CategoryId);
}
map += "</ul>";
}
return map;
}
}