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;
}
}
你没有任何在 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
;每个嵌套调用都会自然地得到正确的级别。
// Current code
if (dt.Rows.Count > 0)
{
indentLevel = indentLevel + 1;
}
BuildTable(dt, indentLevel);
在这个特殊情况下,这实际上不会造成任何伤害,因为当dt.Rows
为空时该方法什么也不做,但这意味着您的代码有些混乱。我个人更喜欢总是使用大括号