一个小问题讨论下。关于foreach的

问题描述

请编写一个小程序,使用foreach遍历一个DataTable,DataTable中有姓名、年龄、性别等字段,删除年龄小于18岁且性别为男性的记录经过大家的帮助研究出第一种情况DataTabledt;foreach(DataRowdrindt){if(int.Parse(dr["age"].ToString())<18&&dr["sex"].ToString()=="male")dt.Rows.Remove(dr);}//抛出dt.rows集合已经改变的异常第二种情况用FOR来做DataTabledtfor(inti=0;i<dt.Rows.Count;i++){if(Convert.ToInt32(dt.Rows[i]["年龄字段"])<18&&dt.Rows[i]["性别字段"].ToString()=="男"){dt.Rows.RemoveAt(i);}}第一种情况有异常,肯定是不可以的。第二种不符合题目的要求。大家帮忙想下有没办法解决~?

解决方案

解决方案二:
intb=0;inti=dt.Rows.Count;while(b!=i){DataRowdr=dt.Rows[b];if(int.Parse(dr["age"].ToString())<18&&dr["sex"].ToString()=="male"){dt.Rows.Remove(dr);i--;}else{b++;}}

解决方案三:
呵呵必须用FOREACH来做
解决方案四:
foreach(objectvarincollection_to_loop){//删除collection_to_loop中元素}for(inti=0;i<obj.length;i++){//删除obj中元素}以上两种遍历方式在删除遍历对象中元素时是不可以的。正确的方法是:for(inti=obj.length;i>0;i--){//删除操作}
解决方案五:
题目的要求?LZ,是哪个出的题目啊?foreach只能用于只读的,不能对它循环的集合做更改.所以,只有用第二种for循环.你可以告诉出题的人,题目错了.不过,可以试试这样:usingSystem.Collections;Hashtableht=newHashtable();//定义hashtable用于保存要删除的datarowDataTabledt=//你要的datatableforeach(DataRowrindt){if(int.Parse(dr["age"])<18&&dr["sex"].ToString().ToLower()=="male")ht.Add(r["Id"],r["name"]);//r["Id"]是记录的主键}foreach(DictionaryEntryeinht)//foreach循环删除{DataRowrow=dt.Rows.Find(e.Key);if(row!=null)dt.Rows.Remove(row);}

ps:就象我上次去面试一个公司,那个面试我的人既然不知道C#2.0可以用foreach!!
解决方案六:
intlen=dt.Rows.Count;for(inti=0;i<len;i++){if(Convert.ToInt32(dt.Rows[i]["年龄字段"])<18&&dt.Rows[i]["性别字段"].ToString()=="男"){dt.Rows.RemoveAt(i);len=dt.Rows.Count;i--;}}

解决方案七:
publicvoidcontrol(DataTabledt){foreach(DataRowdrindt){if(Convert.ToInt16(dr["age"])<18&&dr["sex"]=="male");{dataGridView1.Rows.Remove(dr);}}}

你开始操作传过来的dt肯定不行,它是形参!看看这样好不好用
解决方案八:
汗两下,星星老大果然牛,这么拐的法子都想的出...
解决方案九:
用for语句的话,可以试试从尾巴开始遍历然后删除符合条件的,这样的话应该不会对接下来的过程造成影响~
解决方案十:
foreach假设它是按索引从小到大遍历的那理论上就是在删除一项之后因为前面少了一项下一个要遍历的项的索引不变就可以了foreach默认有i++的过程那就添加一句i--了不过不知道能不能行看好多人说这个时候进行删除操作不行自己试试去~~
解决方案十一:
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data;namespaceConsoleApplication1{classTestDataTable{privateDataTabletestedTable=newDataTable("TestTable");publicvoidInitDataTable(){DataColumncolumnId=newDataColumn("Id",typeof(int));columnId.AutoIncrement=true;columnId.AutoIncrementSeed=1L;columnId.AutoIncrementStep=1L;this.testedTable.Columns.Add(columnId);DataColumncolumnSex=newDataColumn("Sex",typeof(string));this.testedTable.Columns.Add(columnSex);DataColumncolumnAge=newDataColumn("Age",typeof(int));this.testedTable.Columns.Add(columnAge);this.testedTable.PrimaryKey=newDataColumn[]{columnId};}publicvoidFillDataTable(){for(inti=0;i<20;i++){DataRowrow=this.testedTable.NewRow();row["Sex"]="男";row["Age"]=i;this.testedTable.Rows.Add(row);}for(inti=0;i<20;i++){DataRowrow=this.testedTable.NewRow();row["Sex"]="女";row["Age"]=i;this.testedTable.Rows.Add(row);}}publicvoidProcess(){DataTabletempTable=this.testedTable.Clone();foreach(DataRowrowinthis.testedTable.Rows){if(!((int)row["Age"]<18&&row["Sex"].ToString()=="男")){tempTable.ImportRow(row);}}this.testedTable.Clear();this.testedTable.Merge(tempTable,true,MissingSchemaAction.AddWithKey);}publicvoidDisplayDataTable(){foreach(DataColumncolinthis.testedTable.Columns){Console.Write(col.Caption+"t");}Console.WriteLine();foreach(DataRowrowinthis.testedTable.Rows){foreach(DataColumncolinthis.testedTable.Columns){Console.Write(row[col]+"t");}Console.WriteLine();}}}}usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){try{TestDataTabletest=newTestDataTable();test.InitDataTable();test.FillDataTable();test.DisplayDataTable();Console.WriteLine("After");test.Process();test.DisplayDataTable();}catch(Exceptionex){Console.WriteLine(ex.Message);}}}}

解决方案十二:
我程序的思想是,既然是删除,那么把不用删除的提取出来再导入回原来的DataTable中。但是效率上不怎么高。又有想法,用DataView中的Filter过滤然后ToTable().再Marge回去

时间: 2024-08-18 17:39:09

一个小问题讨论下。关于foreach的的相关文章

c++-初学C++ 一个小程序 求大神帮忙看下

问题描述 初学C++ 一个小程序 求大神帮忙看下 //分秒显示函数 #include using namespace std; //全局引用std命名空间 void showTime(int ,int); int main() { int hours =0 , mins = 0;//定义且初始化分 和秒 cout << "Input the hour "; cin >> hours; cout << "Input the mins &quo

代码-最近小弟用到了liunx,在windows下用cygwin学习了下,遇到一个小问题

问题描述 最近小弟用到了liunx,在windows下用cygwin学习了下,遇到一个小问题 echo abc>test.txt后 使用chmod更改权限-r 为什么使用cat test.txt还是可以查看 还想问一下,windows自带的powershell工具,为什么使用代码新建不了文件呢,只能建文件夹

生成jQuery simple treeview所需html的一个小控件

(正在装 VS2008,乘这个时间分享下一个小控件,没法整理demo,只能从项目中copy部 分代码) jQuery simple treeview 需要这样的一段html <ul class="filetree" id="treeFolder"> <li id="1"><span class="folder">Root</span> <ul> <li id=&

$.extend 的一个小问题

  本文给大家记录的是个人在使用$.extend 的时候遇到的一个小问题,以及原因分析和解决方案,十分的实用,有需要的小伙伴可以参考下. 最近一直在搞移动端,也由于自己对jQuery比较熟悉,再加上Zepto提供了跟jQuery一样的API,所以就选择了Zepto作为开发框架. 由于是移动端开发,所以也应用了一些ES5新增的API,比如forEach,下面就是我写的代码的一些示例: ? 1 2 3list.forEach(function(v) { return !!v; }) 我天真的以为fo

visual studio 2010-关于VS的一个小测试程序问题,函数调用顺序

问题描述 关于VS的一个小测试程序问题,函数调用顺序 新手学C++,把C++ primer 上的两个例子用Visual Studio 2010弄到一起的时候出现了一个问题. 一共用了三个函数放在三个cpp文件,被调用的两个均用头文件进行了声明. 两个函数实现的功能很简单分别是:1.多个数相加求和(plus()) 2.输入两个数字作为上界和下界并求和.(two_num()) 问题出现在:在main函数下进行调用的时候, 先调用two_num();再调用plus()可以正常执行. #include

如何打造一个小而精的电商网站架构?

本文大纲: 1. 小型电商网站的架构 2. 日志与监控系统的解决方案 3. 构建数据库的主从架构 4. 基于共享存储的图片服务器架构 5. 移动M站建设 6. 系统容量预估 7. 缓存系统      一.小型电商网站的架构     刚从传统软件行业进入到电商企业时,觉得电商网站没有什么技术含量,也没有什么门槛,都是一些现有的东西堆积木似的堆出来罢了.然而,真正进入到这个行业之后,才发现并非如此.有人说过,好的架构,是演化出来的,电商网站的架构也是如此.现在好的电商网站,看似很复杂,很牛逼,其实也

15条小贴士助你成功开发一个小游戏

有太多的游戏都在还未开发完成的时候就被作者放弃了.独立游戏<安琪拉之歌>的作者Derek Yu这篇文章中列出了15条小贴士,讨论如何成功的去完成一款游戏.这些小贴士能够帮助广大的游戏开发者,认清开发过程中所遇到的问题,并讨论如何去解决它. 完成一款游戏 在我努力完成自己游戏期间,我一直在思考一般情况下如何完成项目.我已经注意到有很多优秀的开发人员对于完成游戏这件事都会遇到麻烦.说实话,我身后已经留下了一长串未完成的游戏...我想每个人都有.由于各种原因,不是每个项目都能有成果.但是如果你发现自

使用javaEE的SSH框架,做的一个小项目出现了奇怪的问题,请求有经验的前辈搭救!!

问题描述 最近刚做好的一个小项目,在我电脑整正常显示,我把项目直接发给一同学,然后他运行可以,但有些地方显示缺出现了问题,例如基本信息管理里面的查询结果,他有些网页不能完全显示,有的又可以,我想问下,这可能是什么问题?我真的无从下手了,求大神指点.我的正常显示:同学的有些网页缺显示不完全:JSP显示结果的部分代码(java后台那部分代码就是查询出符合的记录,并以CclassList输出):<!--查询结果--><c:iftest="${request.CclassList!=n

c语言-讨论下这两个函数fact1和fact2的效率

问题描述 讨论下这两个函数fact1和fact2的效率 int fact1(int limit) { for (i=1;i<limit;i++) fact *= i; } int fact2(int limit) { for (i=limit; i!=0; i--) fact *= i; } 这个是当时上学老师出的一道题,我也觉得应该效率一样,不知道各位有什么不同看法 根据10楼兄弟的回答,我用objdump的反汇编结果如下: 00000000004004c2 <fact1>: 4004