Иерархическая структура с пятью числовыми уровнями - как вставить родственные или дочерние строки и настроить существующие записи? - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть таблица с «точечной» (или контурной) иерархией: поля: L1, L2, L3, L4, L5 (L = уровень)

Например:

1.0.0.0.0
1.1.0.0.0
1.1.1.0.0
1.1.2.0.0
1.2.0.0.0

Если IЯ хочу вставить родного брата в 1.1.1.0.0. Я должен получить новую строку 1.1.2.0.0 - и уже существующий 1.1.2.0.0 должен быть скорректирован до 1.1.3.0.0 и т. д.

Если я хочу вставить дочерний элемент 1.1.1.0.0, я должен получить новую строку 1.1.1.1.0 без каких-либо корректировок, поскольку на этом уровне не существует родных элементов.

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

Может кто-нибудь, пожалуйста, порекомендуйте даже псевдокод для обработки этих 2 типов вставоки необходимые корректировки уже существующих «строк»?

Любая помощь или предложения будут с благодарностью!

1 Ответ

0 голосов
/ 23 февраля 2019

Люди, которые дали вам комментарии, я не думаю, что действительно поняли проблему.У вас уже есть таблица, поэтому использование LinkedList не делает ничего, кроме таблицы.Вам действительно нужно передать методу строку для вставки и поле для вставки.Просто добавление новой строки со значением 1.1.1.0.0 не дает достаточно информации для перенумерации.

В приведенном ниже коде я использовал таблицу данных с каждым столбцом в поле.Чтобы сделать код просто, я предполагаю, что индексы являются целыми числами.Код не очень сложный

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Outlining outling = new Outlining();
            outling.Add(2,2);
            outling.Add(0, 2);
            outling.Add(5, 2);
        }
    }
    public class Outlining
    {
        public DataTable dt = null;

        public Outlining()
        {
            dt = new DataTable();
            dt.Columns.Add("L1", typeof(int));
            dt.Columns.Add("L2", typeof(int));
            dt.Columns.Add("L3", typeof(int));
            dt.Columns.Add("L4", typeof(int));
            dt.Columns.Add("L5", typeof(int));

            dt.Rows.Add(new object[] { 1, 0, 0, 0, 0 });
            dt.Rows.Add(new object[] { 1, 1, 0, 0, 0 });
            dt.Rows.Add(new object[] { 1, 1, 1, 0, 0 });
            dt.Rows.Add(new object[] { 1, 2, 0, 0, 0 });
        }
        public void Add(int at, int level)
        {
            DataRow newRow = dt.Rows.Add();
            if (at < dt.Rows.Count - 1)
            {
                //move row if not last row
                dt.Rows.Remove(newRow);
                dt.Rows.InsertAt(newRow, at);
            }
            newRow.BeginEdit();
            newRow.ItemArray = dt.Rows[at + 1].ItemArray.Select(x => (object)x).ToArray();
            newRow.EndEdit();

            Renumber(at, level);
        }
        public void Renumber(int rowInsertIndex, int level)
        {
            for (int row = rowInsertIndex; row < dt.Rows.Count - 1; row++)
            {
                Boolean match = true;
                //check if columns to left still match, if no we are done
                for (int i = 0; i < level - 1; i++)
                {
                    if (dt.Rows[i][level] != dt.Rows[i + 1][level])
                    {
                        match = false;
                        break;
                    }
                }
                if (!match) break;
                dt.Rows[row + 1][level] = ((int)(dt.Rows[row + 1][level])) + 1;
            }
        }

    }
}
...