从树结构获取列表

时间:2018-01-24 06:50:09

标签: c#

我在c#中有一个CategoryModel类,它是树的一个元素:

public class CategoryModel
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string NameEng { get; set; }
    public string ParentCategoryId { get; set; }
    public ICollection<string> ChildCategoriesIds { get; set; } = new List<string>();
    public ICollection<string> ProductsIds { get; set; } = new List<string>();
}

public class Product
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string NameEng { get; set; }
}

ChildCategoriesIds包含IdCategoryModelProductsIds包含IdProduct

如何在新类中处理数据:

public class CategoryNew
{
    public string Uid { get; set; }
    public string Name { get; set; }
    public string NameEng { get; set; }
    public bool? IsDeleted { get; set; }
    public IEnumerable<UidName> ChildCategories { get; set; } = new List<UidName>();
    public IEnumerable<UidName> Products { get; set; } = new List<UidName>();
}

public class UidName
{
    public string Uid { get; set; }
    public string Name { get; set; }
    public string NameEng { get; set; }
    public bool? IsDeleted { get; set; }
}

2 个答案:

答案 0 :(得分:0)

您可以为CategoryNew指定自己的构造函数,它将作为类CategoryModel的参数对象,您将在其中基于{的属性值设置CategoryNew的所有属性。 {1}}:

CategoryModel

然后你的方法是:

public CategoryNew(CategoryModel cm){
    // set properties
}

答案 1 :(得分:0)

假设您正在尝试将一组对象转换为另一组对象。 首先,我认为类别应该继承UidName,这样你就可以通过减少重复的对象来更有效地记忆。

public class CategoryNew: UidName
{
    public IEnumerable<CategoryNew> ChildCategories { get; set; } = new List<CategoryNew>();
    public IEnumerable<UidName> Products { get; set; } = new List<UidName>();
}

public class UidName
{
    public string Uid { get; set; }
    public string Name { get; set; }
    public string NameEng { get; set; }
    public bool? IsDeleted { get; set; }
}

// first run to create products
var newProducts = products.Select(p => new UidName {
    Uid = p.Id,
    Name = p.Name,
    NameEnd = p.NameEng
}).ToArray();

// second run to create categories with products
var newCategories = categories.Select(c => new CategoryNew {
    Uid = c.Id,
    Name = c.Name,
    NameEng = c.NameEng,
    IsDeleted = (bool?)null,  //TODO
    Products = newProducts.Where(p => c.ProductIds.Contains(p.Uid))
                          .ToList()
}).ToArray();

// last run find sub categories
foreach(var category in newCategories) {
    var oldCategory = categories.First(c => c.Id == category.Uid);
    category.ChildCategories = newCategories.Where(c => oldCategory.ChildCategoriesIds.Contains(c.Uid))
                                            .ToArray();
}