想问个C#遇到的一个问题

问题描述

我写了个递归的方法publicvoidAnyGetString(Formform,intan){InfoInfoTemp=TempFile.Find(delegate(Infov){returnv.FormName==form.Name;});if(InfoTemp!=null){List<Info.form>formtemp=newList<Info.form>(InfoTemp.FormText);if(InfoTemp.FormName=="PmxViewEdit"){form.Font=newSystem.Drawing.Font("MSUIGothic",9f);}foreach(FieldInfofiinform.GetType().GetFields(BindingFlags.Instance|BindingFlags.NonPublic)){objecto=fi.GetValue(form);//获取字段对象if(o!=null){if(oisControl)//判断类型{if((((Control)o).Text)!="0"&&(((Control)o).Text)!=""){System.Text.RegularExpressions.Regexregex=newSystem.Text.RegularExpressions.Regex(@"^[A-Za-z0-9]+$");if(!regex.IsMatch((((Control)o).Text))){if((((Control)o).Name).ToString()==""){//temp.Add(newInfo.form("message",((Control)o).Text));//((Control)o).Text="Test";}else{//temp.Add(newInfo.form(((Control)o).Name,((Control)o).Text));Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((Control)o).Name);});if(temp!=null){if(temp.text!=""){((Control)o).Text=temp.text;}}}}}if((((Control)o).Name)=="vtCtrl"){Console.WriteLine();FieldInfo[]FI=o.GetType().GetFields(BindingFlags.Instance|BindingFlags.NonPublic);foreach(FieldInfoTEmpinFI){objectop=TEmp.GetValue(o);if(opisToolStripItem){Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((ToolStripItem)op).Name);});if(temp!=null){if(temp.text!=""){((ToolStripItem)op).Text=temp.text;}if(temp.ToolTipText!=""){((ToolStripItem)op).ToolTipText=temp.ToolTipText;}}}}}}if((oisForm)&&(an==0)){this.AnyGetString((Form)o,1);}if((oisForm)&&(an==1)){this.AnyGetString((Form)o,2);}if((oisForm)&&(an==2)){this.AnyGetString((Form)o,3);}if((oisForm)&&(an==3)){this.AnyGetString((Form)o,4);}if(oisToolStripItem){if((((ToolStripItem)o).Text)!="0"&&((ToolStripItem)o).Text!=""){Regexregex=newRegex(@"^[A-Za-z0-9]+$");if(!regex.IsMatch((((ToolStripItem)o).Text))){Info.formtemp=formtemp.Find(delegate(Info.formv){returnv.ID==(((ToolStripItem)o).Name);});if(temp!=null){if(temp.text!=""){((ToolStripItem)o).Text=temp.text;}if(temp.ToolTipText!=""){((ToolStripItem)o).ToolTipText=temp.ToolTipText;}}}}}}}}}

然后if((oisForm)&&(an==0)){this.AnyGetString((Form)o,1);}if((oisForm)&&(an==1)){this.AnyGetString((Form)o,2);}if((oisForm)&&(an==2)){this.AnyGetString((Form)o,3);}if((oisForm)&&(an==3)){this.AnyGetString((Form)o,4);}

这一段代码么,我想改成if((oisForm)&&(an<5)){an++;this.AnyGetString((Form)o,an);}

按理说这样修改后应该是等价的,但事实确不是如此,修改后的处理的次数,要远远小于没修改之前的,所以想问一下,到底是怎么回事

解决方案

解决方案二:
话说你应该看看sp1234大大的帖子"重量级查询控件"http://bbs.csdn.net/topics/310047728当然他这个要稍微改改,不过基本思想要理解了,把查询条件延后,代码就清楚的多。
解决方案三:
递归不是这样用的,你这个可以用for循环来处理之所以出现这样,是因为你的an++,是在函数外的,并不是在AnyGetString内如果改在if ((o is Form) && (an == 0))之前++的话,这个代码是可以运行的,也是你理想中的。不过你这个代码,可优化的地方还是比较多的,有一些位置我不知道是你的需求是这样,还是不刻意的,确实可以重新写。
解决方案四:
引用2楼fei2yun的回复:

递归不是这样用的,你这个可以用for循环来处理之所以出现这样,是因为你的an++,是在函数外的,并不是在AnyGetString内如果改在if ((o is Form) && (an == 0))之前++的话,这个代码是可以运行的,也是你理想中的。不过你这个代码,可优化的地方还是比较多的,有一些位置我不知道是你的需求是这样,还是不刻意的,确实可以重新写。

唔,非常感谢你的解答,不过an++不能放在if的外面,因为我需要判断(o is Form)后再进行an++这段代码是对某个程序窗口的反射,获取该窗口未知深度情况下的所有控件的text属性并进行修改由于窗口里面还嵌套的另外的窗口,所以我需要用这个判断是否遇到了另外的窗口,所以不能在外面an++,同时也不能取消这个变量,因为没了这个参数会无限制的叠加直到程序崩溃。
解决方案五:
哪里等价了?
解决方案六:
改成下面这样,似乎就等价了if((oisForm)&&(an<5)){this.AnyGetString((Form)o,(an+1));}
解决方案七:
++有时会引来灾难,少用
解决方案八:
引用5楼From_TaiWan的回复:

改成下面这样,似乎就等价了if((oisForm)&&(an<5)){this.AnyGetString((Form)o,(an+1));}

非常感谢,确实得到的结果有所改变,虽然三种方法获得的值都不一样233不过有点想知道,为啥会出现这种情况?
解决方案九:
if((oisForm)&&(an<5)){an++;this.AnyGetString((Form)o,an);}这样写,执行后an本身的值变了,而原来算法,是没有改变an的值从全部代码看,当an值不同时,就会进入不同的递归,所以an的值很“敏感”

时间: 2024-11-01 21:16:22

想问个C#遇到的一个问题的相关文章

我想问一下:怎样通过一个单击事件打开你的资源管理器,选择一个文件,而这个文件的路径传到listbox的Items中?

问题描述 我主要是是用一个menustrip控件,一个windowsmediaplayer,listbox.运行后,点击menustrip的单击事件,打开了资源管理器,然后选择一个文件,而这个文件的路径传到listbox的Items中,点击listbox的文件名就可以播放了 解决方案 解决方案二:使用OpenFileDialog控件.解决方案三:引用1楼caozhy的回复: 使用OpenFileDialog控件. 点击后选择文件加载路径解决方案四:引用2楼的回复: 引用1楼caozhy的回复:使

java-今天面试的时候遇到一个问题,查三张表,有一百万条纪录,怎么查?他是想问什么,数据库优化吗

问题描述 今天面试的时候遇到一个问题,查三张表,有一百万条纪录,怎么查?他是想问什么,数据库优化吗 今天面试的时候遇到一个问题,查三张表,有一百万条纪录,怎么查?他是想问什么,数据库优化吗 解决方案 我不认为索引或分页是重点. 那不是怎么查的问题,而是怎么优化数据库的问题. 我觉得应该是查的方式或访问数据的方式,防止内存溢出,两种方法. 1.用游标查,而不是一下子取到内存中. 2.一回查询一定量数据,取多回. ps: 查的时候,在有必要的时候加上HINT句,可以优化效率. 这个你也说了的话,我觉

安卓-没有代码,我单纯的想问一个关于二维码的问题

问题描述 没有代码,我单纯的想问一个关于二维码的问题 就是说,我在视频上学会了在安卓手机上如何扫描二维码,但是我尝试着扫描一些广告的二维码,他返回的数据就是一个网址,但是我现在要实现的功能是: 每个学生都有自己的二维码,上面有他们的信息,我要制作一个扫二维码的功能来实现对他们二维码的扫描,然后将该学生的信息显示到手机上面,请问这个应该怎么实现呀,我应该再在程序里面加什么呢 解决方案 看你二维码里面是什么,如果是学员ID,你可以扫完之后去学校的学生系统里面去根据id去得到这个用户的信息,不知道对不

我想问一下在netlogo系统动力学环境下新建一个模型关于stock

问题描述 我想问一下在netlogo系统动力学环境下新建一个模型关于stock 我想问一下在netlogo系统动力学环境下新建一个模型关于stock的问题.比如入口父母数量为stock,在20到50岁可以生孩子且生了3个孩子就不能生孩子.要怎样才可以让人口数量随年龄变化还受孩子个数限制.

新手java-Java新手,想问一个关于在线考试系统的问题。

问题描述 Java新手,想问一个关于在线考试系统的问题. 现在做一个在线考试系统,从数据库拿到了一整张试卷(有单选,多选,判断,简答题),把题目一题占一页的显示在页面上,然后点击next到第二题.如何把选的这些答案保存到数据库?是点击一下next保存一个,还是一张试卷全做完了点击submit一起保存?具体怎么解决呢? 解决方案 随便呗,要是一起保存,就写全局的静态Map存数据,最后一次提交,保存Map数据,然后在清空占用内存 解决方案二: 你在去题目的同时为何不一起把答案取出来,然后在做完试卷的

objective-c-ios 想问一个很简单的异步问题

问题描述 ios 想问一个很简单的异步问题 [manager POST:@""https://www.baidu.com"" parameters:@{} success:^(AFHTTPRequestOperation *operation id responseObject) { NSLog(@""ok1""); } NSLog(@""ok2""); 很明显这段代码 如果打印的话 肯

有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络

问题描述 有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络 有一个节点,我想问在gephi软件中能不能实现一个节点自己与自己创建关联网络

不好意思了各位大虾我想问一个问题,一个前台页面如何实现点击导航以后,头部尾部 消失中间高度自适应。

问题描述 不好意思了各位大虾我想问一个问题,一个前台页面如何实现点击导航以后,头部尾部 消失中间高度自适应. 不好意思了各位大虾我想问一个问题,一个前台页面如何实现点击导航以后,头部尾部 消失中间高度自适应. 解决方案 整个页面高宽全给百分比100%,然后在给中间的部分高度100%,然后首位隐藏后,中间部分就自动补满了.

渣……要做一个Android电子琴app 想问音源怎么弄

问题描述 渣--要做一个Android电子琴app 想问音源怎么弄 刚接触Android,因为毕业设计要求做一个Android平台的电子琴app,准备设计两个八度的音调跨度,那么按键音源去哪里找?还是要自己合成? 解决方案 google应该是没有这种现成的音频文件,你应该要自己去生成8音,录成音频文件,再解析 解决方案二: 以前做过一个电脑上的,不过windows有自带音源.android好像没有自带音源,估计要自己生成. 可以自己录音.建议去下载一个电脑上的电子琴软件之类的,然后在电脑上录音,