[c#]Linq-如何循环生成树样式对象树数据结构

标签: Linq C#
发布时间: 2017/2/28 22:34:09
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有以下的 SQL 表数据︰

enter image description here

可视化树应类似于︰

enter image description here

让我使用非常顶级节点︰

var parentNodes = data
    .Where(i => i.AncestorId == i.DescedantId &&
                (data.Count(d => d.DescedantId == i.DescedantId) == 1))
    .ToList();

任何线索关于如何构建一个函数,它会循环槽结构,然后再生成树样式对象吗?

我树样式对象类是︰

public class ProfitCenterRoot
{
    public List<ProfitCenterItem> Data { get; set; }
}

public class ProfitCenterItem
{
    public int AncestorId { get; set; } 
    public int DescendantId { get; set; }
    public string Text { get; set; }
    public bool Leaf { get; set; }

    // These are the child items
    public List<ProfitCenterItem> Data { get; set; }
}

解决方法 1:

你可以使用递归将添加到每个家长的儿童。但首先,会将默认的构造函数添加成您的类来初始化数据列表︰

public class ProfitCenterRoot
{
    public List<ProfitCenterItem> Data { get; set; }

    public ProfitCenterRoot()
    {
        Data = new List<ProfitCenterItem>();
    }
}

public class ProfitCenterItem
{
    // Existing properties here

    public ProfitCenterItem()
    {
        Data = new List<ProfitCenterItem>();
    }
}

然后你可以创建一种简单的方法,需要在父和列表中的所有儿童,以递归方式将儿童添加到每个子元素的父母,然后添加到父的子元素们︰

public static void AddChildren(ProfitCenterItem parent, 
    IEnumerable<ProfitCenterItem> allChildren )
{
    var children = allChildren
        .Where(child =>
               child.AncestorId == parent.DescendantId &&
               child.AncestorId != child.DescendantId)
        .ToList();

    foreach (var child in children)
    {
        AddChildren(child, allChildren.Except(children));
        parent.Data.Add(child);
    }
}

因此要填充您的对象,然后你可以︰

var parentNodes = data
    .Where(i => i.AncestorId == i.DescendantId &&
                (data.Count(d => d.DescendantId == i.DescendantId) == 1))
    .ToList();

var root = new ProfitCenterRoot();

foreach (var parentNode in parentNodes)
{
    AddChildren(parentNode, data.Except(parentNodes));
    root.Data.Add(parentNode);
}
赞助商