【问题标题】:Building model tree from string从字符串构建模型树
【发布时间】:2018-06-13 20:57:14
【问题描述】:

所以我一直在用头撞墙一段时间。我试图做的是遵循定义为“类别>子类别>子类别的子项......”的类别跟踪,但由于某种原因,我显然无法掌握,应该有父母的类别有时会失败设置他们的 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

【问题讨论】:

  • 我会查看 System.Xml 命名空间或 System.Xml.Linq 命名空间,并了解如何使用它来创建作为 XmlDocument 或 XDocument 的树结构,然后您可以将其转换为字符串.此外,看起来您正在使用实体框架,您可以随时编写自己的 SQL 过程并让它以 XML 形式返回您的数据。
  • 我正在尝试从字符串创建模型,而不是将模型转换为字符串。这样做的原因是我正在尝试从 csv 导入产品数据,我似乎遇到的问题是我搞砸了建立关系,但我看不到在哪里。对不起,糟糕的解释。
  • 您在哪里保存对数据库的更改?父母的 ID 是在数据库中自动生成的,因为您只需调用 new ProductCategory { Name = categoryName }; 或者您在哪里设置 ID?您可能应该设置您的模型,以便自动设置 FK。
  • @JamesAnderson - 你能编辑你的问题在底部发布几行实际的字符串数据吗?
  • 这包含在一个循环中,该循环遍历 csv 的每一行,因此一旦循环退出,更改就会保存。据我所知,我使用的是处理 Ids 的实体框架。它肯定已经设置了外键。我已经编辑了帖子以包含一些传入字符串数据的示例。

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


【解决方案1】:

类似这样的简单方法可以使用,使用 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;
    }

}

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

我不确定你想要实现什么不同,但也许这会给你一些想法。

【讨论】:

  • 这个问题是每个字符串并不总是描述一个唯一的树。正如示例字符串所示,Glassware 等多次出现,并且每次都需要指向同一个节点,希望这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2013-02-08
  • 2021-11-26
相关资源
最近更新 更多