c # datatable рекурсивный вывод - PullRequest
       18

c # datatable рекурсивный вывод

0 голосов
/ 13 декабря 2011

У меня есть таблица данных, которая имеет следующую структуру:

id | parentid | name
1  | 0        | Parent
2  | 1        | Child
3  | 2        | child of child
4  | 1        | second child

Я застрял, чтобы вывести их как родительский (в основном я пытаюсь использовать open xml, чтобы вывести их как toc), может кто-нибудь, пожалуйста, помогите мневывести их как родительский дочерний элемент в списке или, возможно, словаре ...

Спасибо

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Вот мое предложение для вас.Создайте объект данных (выберите более подходящее имя и добавьте еще несколько свойств, если необходимо), например,

public class DataNode
{
    public int Id { get; private set; }

    public string Name { get; set; }

    public List<DataNode> Children { get; private set; }

    public DataNode(int id, string name)
    {
        Id = id;
        Name = name;
        Children = new List<DataNode>();
    }
}

Создайте список таких узлов, как var dataNodeList = new List<DataNode>();, и добавьте все элементы, у которых нет родителя напрямуюв этот список.Добавьте каждого потомка в список родителей Children с помощью parentid.Чтобы найти родителя в вашем дереве, используйте эту функцию:

public DataNode FindElementById(IEnumerable<DataNode> elementsToSearch, int id)
{
    foreach (var dataNode in elementsToSearch)
    {
        if (dataNode.Id == id)
        {
           return dataNode;
        }
        var found = FindElementById(dataNode.Children, id);
        if (found != null)
        {
           return found;
        }
     }
     return null;
 }
0 голосов
/ 13 декабря 2011

Проверьте это решение .Вы можете использовать его следующим образом:

var hierarchy =
    table.AsEnumerable().ToHierarchy(
        r => r.Field<int>("parentid") == 0,
        (parent, child) => parent.Field<int>("id") == child.Field<int>("parentid"));
...