Преобразование плоской структуры данных в иерархию объектов с использованием c # - PullRequest
3 голосов
/ 15 июня 2011

У меня следующая плоская структура данных.

ParentAttributeId AttributeId  List
----------------- -----------  ------
NULL              29          TestcaseCollection
29                30              EnclosureLeakageDielectricStrengthTest
30                31                  DeviceID
30                32                  ScannerOneLowChannel
30                33                  ScannerTwoLowChannel
29                34              EnclosureLeakageLeakageCurrentTest
34                35                  DeviceID
34                36                  ScannerOneLowChannel
34                37                  ScannerTwoLowChannel
29                38              PatientCircuitLeakageTest
38                39                  DeviceID
38                40                  ScannerOneLowChannel
38                41                  ScannerTwoLowChannel
29                42              SIPSOPDielectricStrengthTest
42                44                  ScannerOneHighChannel
42                45                  ScannerOneLowChannel
42                46                  ScannerTwoHighChannel
42                47                  ScannerTwoLowChannel
29                48              SIPSOPLeakageCurrentTest
48                49                  ScannerOneHighChannel
48                50                  ScannerOneLowChannel
48                51                  ScannerTwoHighChannel
48                52                  ScannerTwoLowChannel

Мне нужно преобразовать указанную выше плоскую структуру данных в иерархическую структуру объектов, как показано ниже.Таким образом, мой объект выглядит как столбец «Список» выше.Я использую SQL Stored Proc для получения вышеуказанных данных.Я использую C #.

Иерархия объектов

29
  |
  30 
   |  31
   |  32
   |  33
   |   
  34
   |  35
   |  36
    |37
  38

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

С уважением, Niju * ​​1013 *

Ответы [ 2 ]

1 голос
/ 15 августа 2018

Вы можете попробовать что-то вроде этого:

1) Создать класс узлов

class Node
{
    public int ParentId { get; private set; }
    public int Id { get; private set; }
    public string Label { get; private set; }
    public Node Parent { get; set; }
    public List<Node> Children { get; } = new List<Node>();

    public Node(int parentId, int id, string lable)
    {
        ParentId = parentId;
        Id = id;
        Label = lable;
    }

    public void AddChild(Node child)
    {
        child.Parent = this;
        Children.Add(child);
    }

    public void Trace(int indent = 1)
    {
        Enumerable.Range(0, indent).ToList().ForEach(i => Console.Write(" - "));
        Console.WriteLine(Label);
        Children.ForEach(c => c.Trace(indent + 1));
    }
}

2) Создать объекты узлов из ваших плоских данных и добавить их в словарь

var data = new List<DataRow>() {
            new DataRow { ParentId = 0, Id = 1, Label = "parent" },
            new DataRow { ParentId = 1, Id = 2, Label = "child 1" },
            new DataRow { ParentId = 1, Id = 3, Label = "child 2" },
            new DataRow { ParentId = 2, Id = 4, Label = "grand child 1" },
            new DataRow { ParentId = 2, Id = 5, Label = "grand child 2" }
        };

Dictionary<int, Node> nodes = data.ToDictionary(d => d.Id, d => new Node(d.ParentId, d.Id, d.Label));

3) Построить иерархию, просматривая все узлы, вызывающие AddChild для родителя

foreach (var node in nodes.Skip(1))
    nodes[node.Value.ParentId].AddChild(node.Value);

Если вы вызовите Trace () для верхнего узла, выходные данные будут выглядеть следующим образом:

 - parent
 -  - child 1
 -  -  - grand child 1
 -  -  - grand child 2
 -  - child 2
0 голосов
/ 15 июня 2011

Вы смотрели на AutoMapper ?

Не уверен, что это то, что вам нужно, но я часто использую его для преобразования из одного формата в объектную модель.

Другой альтернативой может быть использование LINQ для запроса имеющихся у вас данных и создания модели для вас.

Я думаю, что вы можете сказать что-то вроде, и это не проверено;

выбрать из списка данных выбрать новый {....

где new будет новым объектом, который вы создаете.

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

редактировать

это может помочь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...