Построение дерева модели из строки

Так что я какое-то время бился головой о стену на этом. Что я пытаюсь сделать, так это проследить трассировку категории, определенную как «категория> дочерняя категория> дочерняя категория дочерней категории ...», но по какой-то причине, которую я явно не могу понять, категории, которые должны иметь родительский элемент, иногда терпят неудачу. установить их 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, затем вы можете преобразовать это в строку. Кроме того, похоже, что вы используете entity-framework, вы всегда можете написать свою собственную процедуру SQL, и она будет возвращать ваши данные в виде XML.

Ryan Wilson 13.06.2018 22:59

Я пытаюсь создавать модели из строки, а не превращать модели в строку. Причина этого в том, что я пытаюсь импортировать данные о продукте из CSV. Проблема, с которой я столкнулся, заключается в том, что я испортил настройку отношений, но я не могу понять, где. Извините за ужасное объяснение.

James Anderson 13.06.2018 23:11

Где вы сохраняете изменения в базе данных? Идентификаторы родителей автоматически генерируются в базе данных, поскольку вы просто вызываете new ProductCategory { Name = categoryName }; или где вы устанавливаете идентификаторы? И вам, вероятно, следует настроить свои модели так, чтобы FK устанавливался автоматически.

i regular 13.06.2018 23:26

@JamesAnderson - можете ли вы отредактировать свой вопрос, чтобы разместить несколько строк фактических строковых данных внизу?

jp2code 13.06.2018 23:27

Это содержится в цикле, который проходит по каждой из строк csv, и поэтому изменения сохраняются после выхода из цикла. Я использую entity-framework, который, насколько мне известно, обрабатывает идентификаторы. Он определенно настроил внешние ключи. Я отредактировал сообщение, включив в него несколько примеров входящих строковых данных.

James Anderson 13.06.2018 23:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
60
1

Ответы 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 и т. д. Появляются несколько раз, и каждый раз они должны указывать на один и тот же узел, надеюсь, это имеет смысл.

James Anderson 13.06.2018 23:48

Другие вопросы по теме