递归中,方法中的变量值被改变的问题。

在递归中,假如方法体内的声明的变量是引用类型的话,并且这个变量还是引用类型的话,

如果还要将这个变量放入到递归引用的方法中作为参数的话,递归的逻辑处理结构就会报错误的。

可以看看以下代码:

 

ExpandedBlockStart.gif View Code
 1   ///   <summary>
 2           ///  当前节点的二级及以下节点
 3           ///   </summary>
 4           ///   <param name="dt"></param>
 5           ///   <param name="parentNode"></param>
 6           private  void RecursionTreeNode( DataTable dt, TreeNode parentNode)
 7         {
 8             DataView dv = dt.DefaultView;
 9             dv.RowFilter =  " PARENT_DIRECTORY_CODE=' " + parentNode.Name +  " ' ";
10              for ( int i =  0; i < dv.Count; i++)
11             {
12                 DataRowView dataRow = dv[i];
13                 TreeNode curTreeNode =  new TreeNode();
14                 curTreeNode.Name = dataRow[ " DIRECTORY_CODE "].ToString().Trim();
15                 curTreeNode.Text = dataRow[ " DIRECTORY_NAME "].ToString().Trim();
16                 parentNode.Nodes.Add(curTreeNode);
17                  //  递归添加当前节点的子节点
18                   RecursionTreeNode( dt , curTreeNode);
19             }
20         }

上面的高亮显示的DataTable dt 是引用类型,并且dt作为参数被递归方法继续调用,dt的内部数据会随着每次递归

方法的调用而发生改变,解决这个问题很简单,声明一个临时变量,将dt赋给这个变量就行了。

 

ExpandedBlockStart.gif View Code
 1    ///   <summary>
 2           ///  当前节点的二级及以下节点
 3           ///   </summary>
 4           ///   <param name="dt"></param>
 5           ///   <param name="parentNode"></param>
 6           private  void RecursionTreeNode( DataTable dt, TreeNode parentNode)
 7         {
 8             DataView dv = dt.DefaultView;
 9             dv.RowFilter =  " PARENT_DIRECTORY_CODE=' " + parentNode.Name +  " ' ";
10              foreach (DataRowView dataRow  in dv)
11             {
12                 TreeNode curTreeNode =  new TreeNode();
13                 curTreeNode.Name = dataRow[ " DIRECTORY_CODE "].ToString().Trim();
14                 curTreeNode.Text = dataRow[ " DIRECTORY_NAME "].ToString().Trim();
15                 parentNode.Nodes.Add(curTreeNode);
16                  //  递归添加当前节点的子节点
17                   DataTable dtChild = dt;
18                 RecursionTreeNode( dtChild, curTreeNode);
19             }
20         }

 

 

转载于:https://www.cnblogs.com/frustrate2/archive/2012/05/22/2513292.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值