从字符串建立模型树

时间:2018-06-13 20:57:15

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-5

所以我一直在这个墙上撞墙一段时间。我试图做的是按照定义为“类别>子类别>子类别的孩子......”的类别跟踪,但由于某种原因,我显然无法掌握,应该有父母的类别有时会失败设置他们的ParentId,不是所有的时间!?

string catString = "Category1Name>Category2Name>Category3Name";

        if (!string.IsNullOrEmpty(catString)) {
            string[] catStrings = catString.Split('>');
            ProductCategory[] categories = new ProductCategory[catStrings.Length];

            for (int j = 0; j < catStrings.Length; j++) {
                string categoryName = catStrings[j];
                ProductCategory parent = j > 0 ? categories[j - 1] : null;

                if (j > 0) {
                    categories[j] = _context.ProductCategories.SingleOrDefault(x => x.Name.ToUpper().Replace(" ", "") == categoryName.ToUpper().Replace(" ", "") && x.ParentId == parent.Id);
                } else {
                    categories[j] = _context.ProductCategories.SingleOrDefault(x => x.Name.ToUpper().Replace(" ", "") == categoryName.ToUpper().Replace(" ", ""));
                }

                if (categories[j] == null) {
                    if (j > 0) {
                        categories[j] = new ProductCategory { Name = categoryName, ParentId = parent.Id };

                        if (parent.Children == null) {
                            parent.Children = new List<ProductCategory>();
                        }

                        parent.Children.Add(categories[j]);
                    } else {
                        categories[j] = new ProductCategory { Name = categoryName };
                    }

                    _context.ProductCategories.Add(categories[j]);
                    categoriesCreated++;
                }
            }

            product.Category = categories.Last();
        }

类别定义为

public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public virtual List<ProductCategory> Children { get; set; }

字符串示例

Glassware>Shot Glasses
Glassware>Wine Glasses
Glassware>Glass Carafes/Decanters/Jugs>Glass Carafes
Glassware>Glass Carafes/Decanters/Jugs>Glass Jugs
Tableware>Cutlery>Premium 18/10

1 个答案:

答案 0 :(得分:0)

像这样的简单工作,使用TreeNode对象来包含所有内容。

public class SO50846156
{

    public TreeNode Test(String[] data)
    {
        var root = new TreeNode();
        foreach (var line in data)
        {
            var split = line.Split('>');
            var count = split.Length;
            var item = root.Nodes.Add(split[0]);
            if (1 < count)
            {
                var subCat = item.Nodes.Add(split[1]);
                if (2 < count)
                {
                    var catName = subCat.Nodes.Add(split[2]);
                }
            }
        }
        return root;
    }

}

每次都会创建根元素,并为每行数据创建一个节点。

我不确定你想要完成的是不同的,但也许这会给你一些想法。