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