c#递归函数中的回溯变量

本文关键字:回溯 变量 递归函数 | 更新日期: 2023-09-27 18:07:25

我有这个数据在同一个sql表。我需要为下面的数据创建一个树状结构。一切似乎都工作良好,除了缩进是不工作的权利。我漏掉了一件我不知道的小事。我很感激你的帮助。

这是同一个表中的数据

initiated_by
---------------------
 NULL,42521,42521,41651,41111,41111,41131,41651
user_id (assigned to)
---------------------
42521,41651,42681,41111,42021,41131,42001,43001

我的期望是:

42521 (at level 0)
   41651 (at level 1)
      41111 (at level 2)
        42021(at level 3)
        41131(at level 3)
          42001(at level 4)
      43001(at level 2)
   42681 (at level 1)

但是我得到的是不对的。我不能弄清楚indentLevel部分。indentLevel是一个在类级别声明的变量。

private void BuildTable(DataTable recordList)
    {
        foreach (DataRow dr in recordList.Rows)
        {
            TableRow tblRow = new TableRow();
            TableCell tblCell = new TableCell();
            tblCell.Controls.Add(GetDetailTable(dr, indentLevel));
            tblCell.HorizontalAlign = HorizontalAlign.Left;
            tblRow.Cells.Add(tblCell);
            mainTable.Rows.Add(tblRow);
            //Do we have any child objects
            int cId = Convert.ToInt32(dr["user_id"].ToString());
            DataTable dt = GetChildObjects(Convert.ToInt32(dr["user_id"].ToString()), masterDT);
            if (dt.Rows.Count > 0) indentLevel = indentLevel+1; BuildTable(dt);
        }
    }

    private Table GetDetailTable(DataRow dr, int indentLevel)
    {
        Table DetailTable = new Table();
        DetailTable.Width = Unit.Percentage(100);
        DetailTable.CssClass = "SortableTable";
        TableRow tblRow = new TableRow();
        TableCell tblEmptyCell = new TableCell();
        tblEmptyCell.Width = Unit.Percentage(5);
        tblEmptyCell.Controls.Add(new LiteralControl(string.Empty));
        tblEmptyCell.Width = Unit.Percentage(5 * indentLevel);  
        tblRow.Cells.Add(tblEmptyCell);
        //To Display Name
        TableCell tblCell = new TableCell();
        tblCell.Width = Unit.Percentage(15);
        tblCell.CssClass = "alt-row-hover";
        LiteralControl lc = new LiteralControl(dr["user_id"].ToString());
        tblCell.Controls.Add(lc);
        tblCell.HorizontalAlign = HorizontalAlign.Left;
        tblRow.Cells.Add(tblCell);
        mainTable.Rows.Add(tblRow);
        //To Display Detials
        TableCell tblCellDetials = new TableCell();
        tblCellDetials.CssClass = "alt-row";
        tblCellDetials.Width = Unit.Percentage(80);
        StringBuilder detailString = new StringBuilder();
        detailString.Append("Action: " + Convert.ToString(dr["action_id"]) + "<br>");
        detailString.Append("Action Date: " + Convert.ToString(dr["action_date"]) + "<br>");
        detailString.Append("Comments: " + Convert.ToString(dr["comments"]) + "<br>");
        LiteralControl lcd = new LiteralControl(detailString.ToString());
        tblCellDetials.Controls.Add(lcd);
        tblCellDetials.HorizontalAlign = HorizontalAlign.Left;
        tblRow.Cells.Add(tblCellDetials);

        DetailTable.Rows.Add(tblRow);

        return DetailTable;
    }
}

c#递归函数中的回溯变量

你没有任何 BuildTable末尾减少 indentLevel的内容。

就我个人而言,我会将BuildTable更改为indentLevel,并更改此:

if (dt.Rows.Count > 0) indentLevel = indentLevel+1; BuildTable(dt);

:

if (dt.Rows.Count > 0)
{
    BuildTable(dt, indentLevel + 1);
}

然后初始调用:

BuildTable(rootTable, 0);

…并完全删除实例变量。这样你根本不需要减少indentLevel;每个嵌套调用都会自然地得到正确的级别。

顺便说一下,当涉及到块时,c#不是基于行的-所以目前你的代码相当于:
// Current code
if (dt.Rows.Count > 0)
{
    indentLevel = indentLevel + 1;
}
BuildTable(dt, indentLevel);

这个特殊情况下,这实际上不会造成任何伤害,因为当dt.Rows为空时该方法什么也不做,但这意味着您的代码有些混乱。我个人更喜欢总是使用大括号