Нужна помощь в получении данных из ParentID, если он совпадает с ChildID (чтение txt-файла и сортировка его в консоли) - PullRequest
0 голосов
/ 12 июня 2019

По сути, я получил файл, который мне нужно прочитать \ открыть и отсортировать в консоли.

Файл может иметь столько строк, сколько хочет «Пользователь», и выглядит примерно так

1, элемент,

2, element1,1

3, element2,2

4, element23,1

и так далее ...

Первая часть - это идентификатор родителя, середина - его имя, а третья - идентификатор ребенка.

Если ChildID равен ParentID, мне нужно написать его под ним, чтобы он выглядел как

1, элемент,

  2,element1,1

        3,element2,2

   4,element23,1

Сначала я попытался запомнить каждую часть во временной переменной, а затем сравнить ее позже, но поскольку это не сработало, я создал список, состоящий из элементов, для которых я использовал функцию .Split

и через 2 для циклов, я получил его для сортировки, но проблема возникает, когда я получаю элемент в списке позже, который нужно поместить где-то в начале. Он сортируется по нужному элементу, но не в правильном порядке.

public class information
{
    public string Parent;
    public string Name;
    public string Child;
    public Information

  public Information  (string ParentID, string NameID, string ChildID)
    {
        Parent = ParentID;
        Name = NameID;
        Child = ChildID;
    }
}

В этой части я проверяю условия обоих идентификаторов и выписываю результат.

        for (int i = 0; i < list.Count; i++)
        {
            if (list[i].Child == "")
            {
                Console.WriteLine(list[i].Parent + " " + list[i].Name + " " + list[i].Child);

            }
            for (int k = 0; k < list.Count; k++)
            {
                if (list[i].Parent == list[k].Child)
                {
                    Console.WriteLine("\t" + list[k].Parent + "," + list[k].Name + "," + list[k].Child);

                }
            }

        }

Итак, проблема в том, что когда я пишу такую ​​строку, она не помещается в нужную часть, я также не уверен, как выполнить "\ t", чтобы она продолжалась, в зависимости от того, сколько элементы были написаны до этого.

Я считаю, что следует использовать рекурсивный метод, но на данный момент я не уверен, как это сделать.

1 Ответ

0 голосов
/ 12 июня 2019

Информационный класс, теперь также содержит список дочерних элементов:

class Information
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string ParentId { get; set; }
    public List<Information> Children = new List<Information>();
}

Пример данных:

var data = new List<string>
{
    "2,element1,1",
    "1,element,",
    "3,element2,2",
    "4,element23,1"
};

Логика для структурирования данных:

//Create a dictionary of all items (for performance)
var dict = data
    .Select(s => s.Split(','))
    .Select(s => new Information
    {
        Id = s[0],
        Name = s[1],
        ParentId = s[2]
    })
    .ToDictionary(s => s.Id);

//Link the items by adding each item to the children list
foreach (var v in dict.Values)
{
    if (!string.IsNullOrWhiteSpace(v.ParentId))
    {
        dict[v.ParentId].Children.Add(v);
    }
}

Создайте метод, который вызывает себя для рекурсивной печати:

void PrintRecursive(Information i, int tabCount)
{
    //Print the item
    Console.WriteLine($"{new string('\t', tabCount)}{i.Id},{i.Name},{i.ParentId}");

    foreach (var child in i.Children.OrderBy(o => o.Id))
    {
        //Call the same method with increased tab
        PrintRecursive(child, tabCount + 1);
    }
}

Наконец, вызовите метод печати для всех родительских элементов на самом высоком уровне:

//Print recursively
foreach(var item in dict.Values.Where(o => string.IsNullOrWhiteSpace(o.ParentId)))
{
    PrintRecursive(item, 0);
}
...