问题描述
请编写一个小程序,使用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回去