代码之家  ›  专栏  ›  技术社区  ›  Stian

使用“无限”级别/代对递归列表的项进行排序

  •  0
  • Stian  · 技术社区  · 6 年前

    我有这个型号:

    public class ProductCategory
    {
        public int Id { get; set; }
        public int? ParentId { get; set; }
        public string Title { get; set; }
        public int SortOrder { get; set; }
        public ICollection<ProductCategory> Children { get; set; } = new List<ProductCategory>();
    }
    

    这是我用来将数据加载到递归 <ul> :

    List<ProductCategory> DbCategories = _context.ProductCategories
                .ToList().OrderBy(o => o.SortOrder)
                .Where(e => e.ParentId == null).ToList();
    

    该查询仅对根类别应用排序,因此我将其添加到至少对一代子类别进行排序:

    DbCategories.ForEach(cat => cat.Children = cat.Children.OrderBy(c => c.SortOrder).ToList());
    

    现在,解决方案 this question 建议向类中添加一个方法,如下所示:

    public class ProductCategory
    {
        public int Id { get; set; }
        public int? ParentId { get; set; }
        public string Title { get; set; }
        public int SortOrder { get; set; }
        public ICollection<ProductCategory> Children { get; set; } = new List<ProductCategory>();
    
        public void RecursiveOrder()
        {
            Children = Children.OrderBy(x => x.SortOrder).ToList();
            Children.ToList().ForEach(c => c.RecursiveOrder());
        }
    }
    

    但我有点迷茫——我该如何称呼这种方法?

    编辑 还有一件事;如果 RecursiveOrder() -方法是在实体模型中还是在视图模型中?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Oxald    6 年前

    您可以简单地替换DbCategories的内容。ForEach()调用如下:

    DbCategories.ForEach(cat => cat.RecursiveOrder());
    

    对第一级子级调用RecursiveOrder(),它将递归处理嵌套的子级。

    此外,由于这种排序的目的似乎是为了UI显示,因此将其放在viewmodel中应该更方便(在这种情况下可能需要对其进行一点重构)