大家说一说foreach一个datatable和用for(int i=0;i<mytable.rows.count;i++)去遍历的区别。 foreach 遍历的时候也会因为删除一行而抱错 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 任何实现IEnumerable接口的类型都支持在其包含项目中进行只向前的跌代,支持foreach,实际编译过程中,编译器把foreach声明转换成对IEnumberable的调用,在.net中一旦创建了一个枚举对象,会在原处及时的得到包含在可枚举对象中的项目的快照,如果初始对象发生改变,枚举就会失效,在调用是抛出invalidoperationexception异常. 如果在你的DATATABLE里面加上一个自增长标识种子字段serno,然后使用这样的语句:for(int i = min(mytable.serno), i < max(mytable.serno), ++i){}这样你就可以删除任意行了,删除后也不会有任何影响,访问的时候就可以用serno来标识任意一行 foreach的设计初衷是用来读取数据、简化循环,而不是改变数据的。只要可能,编译器就会强化这一条件。但当集合中的元素为非基准类型时,调用个别对象的更新函数就有可能会改变集合元素的值。个人不推荐你用foreach去改变数据。 如果要删除行,必须用for语句,但有个技巧,那就是从大到小循环(这样就不会受到某行删除后,总行数变化的影响),如:int nCount=myDataSet.Tables["mytable"].rows.count;for(int i=nCount-1;i>=0;i--){ if(……) { myDataSet.Tables["mytable"].rows[i].Delete; }}另外,for(int i = min(mytable.serno), i < max(mytable.serno), ++i)的方法是不可取的(循环次数不多影响不大),因为每一个循环中都要计算一下mini或max,应该放在一个变量中,如本例中的nCount,这样就只计算一次了 数据量不太大时用FOR还可以。否则会很慢!! 最好不要用遍历,方法比较笨DataTable本身有查找方法Select,找到所需的在删除 用while ,然后指针移到next, 直到pos=count-1 if(table[0].rows[1].rowstate != delete) table[0].rows[1].delete(); //delete(), not remove() 求一统计sql语句 如何去掉DES解密后的冗余数据? C#多态 与 java多态到底相同么? 100分相送,求解决C#中筛选问题! 如何将在D3d中生成的图形输出为.X文件 谁用过SystemInformation.Network?为什么返回总是true? 如何修改显示器的分辨率 RadioButton 谁在用C#编制遗传算法 类似于Size、控件属性Margin的类型Padding的时分控件HourMinute的初始化问题 如何在Server.Transfer下实现webform的参数传递,求源码。 请教高手,Win控件在Web上使用如何设置服务器端口?
这样的语句:
for(int i = min(mytable.serno), i < max(mytable.serno), ++i)
{
}
这样你就可以删除任意行了,删除后也不会有任何影响,访问的时候就可以用serno来标识任意一行
但当集合中的元素为非基准类型时,调用个别对象的更新函数就有可能会改变集合元素的值。个人不推荐你用foreach去改变数据。
int nCount=myDataSet.Tables["mytable"].rows.count;
for(int i=nCount-1;i>=0;i--)
{
if(……)
{
myDataSet.Tables["mytable"].rows[i].Delete;
}
}
另外,for(int i = min(mytable.serno), i < max(mytable.serno), ++i)
的方法是不可取的(循环次数不多影响不大),因为每一个循环中都要计算一下mini或max,应该放在一个变量中,如本例中的nCount,这样就只计算一次了
DataTable本身有查找方法Select,找到所需的在删除
table[0].rows[1].delete(); //delete(), not remove()