自引用表到递归列表\集合

时间:2017-12-14 13:07:22

标签: c# algorithm recursion self-reference

我目前在SQL表中有数据,其中包含ConfigHead表和Config Line Table。 Config Line表是一个自引用表。我的新数据结构有ConfigLines,它有一组ConfigLines,我试图递归遍历记录并将子ConfigLines添加到父ConfigLines集合。这就是我现在拥有的......

这是数据结构

ConfigHead

enter image description here

ConfigLine

enter image description here

正如您所看到的,ConfigLine表具有引用自身的ParentConfigLineId。如果ParentConfigLineId为0,那么这意味着它是一个顶级项目。

以下是我正在尝试获取数据的数据模型的形状。

public class ConfigLine
{  
    public int Id { get; set; }
    public int ConfigHeadId { get; set; }
    public int ParentCongigLineId { get; set; }
    public List<ConfigLine> Children { get; set; }
}

public class ConfigHeader
{
    public int Id { get; set; }
    public List<ConfigLine> ConfigLines { get; set; }
}

目前我正试图以递归方式遍历Config Lines,但我不确定如何将其添加到父列表中。这就是我到目前为止所做的。

public void Get(int id)
{
    //Main ConfigHeader Record
    var configHeader = new ConfigHead();

    //Get the record from the db
    var configRecord = _configRepository
                       .GetAll()
                       .Include(p => p.ConfigLines)
                       .Where(x => x.Id == id).FirstOrDefault();

    //Loop the top level config lines
    foreach (var configLine in configRecord.ConfigLines.Where(x => x.ParentConfigLineId == 0))
    {
        if (configLine.ParentConfigLineId == 0)
        {
            //Add the Top Level Config line
            var topLevel = new ConfigLine
            {
                Id = configLine.Id,
                ConfigHeadId = configLine.ConfigHeadId,
                ParentCongigLineId = configLine.ParentConfigLineId
            };

            configHeader.children.Add(topLevel);

            //Check the top level ConfigLine to see if it has any children.
            var topLevelConfigLines = configRecord.ConfigLines
                                      .Where(x => x.ParentConfigLineId == configLine.Id)
                                      .ToList();

            if (topLevelConfigLines.Any())
            {
                AddChildConfigLine(configRecord, configLine);
            }
        }
    }
}

这是我的递归方法 - 我一直坚持如何走下集合,然后将它们添加到父项目中。

private void AddChildConfigLine(ConfigRecord configRecord,
       ConfigLine configLine)
{
    //Check for any child records
    var childConfigLines = configRecord.ConfigLines.Where(x => x.ParentConfigLineId == configLine.Id);

    foreach (var childConfigLine in childConfigLines)
    {
        //How to add to the collection?
        AddChildConfigLine(configRecord, childConfigLine);
    }
}

0 个答案:

没有答案