foreach 遍历的时候也会因为删除一行而抱错

解决方案 »

  1.   

    任何实现IEnumerable接口的类型都支持在其包含项目中进行只向前的跌代,支持foreach,实际编译过程中,编译器把foreach声明转换成对IEnumberable的调用,在.net中一旦创建了一个枚举对象,会在原处及时的得到包含在可枚举对象中的项目的快照,如果初始对象发生改变,枚举就会失效,在调用是抛出invalidoperationexception异常.
      

  2.   

    如果在你的DATATABLE里面加上一个自增长标识种子字段serno,然后使用
    这样的语句:
    for(int i = min(mytable.serno), i < max(mytable.serno), ++i)
    {
    }
    这样你就可以删除任意行了,删除后也不会有任何影响,访问的时候就可以用serno来标识任意一行
      

  3.   

    foreach的设计初衷是用来读取数据、简化循环,而不是改变数据的。只要可能,编译器就会强化这一条件。
    但当集合中的元素为非基准类型时,调用个别对象的更新函数就有可能会改变集合元素的值。个人不推荐你用foreach去改变数据。
      

  4.   

    如果要删除行,必须用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,这样就只计算一次了
      

  5.   

    数据量不太大时用FOR还可以。否则会很慢!!
      

  6.   

    最好不要用遍历,方法比较笨
    DataTable本身有查找方法Select,找到所需的在删除
      

  7.   

    用while ,然后指针移到next, 直到pos=count-1
      

  8.   

    if(table[0].rows[1].rowstate != delete)
      table[0].rows[1].delete(); //delete(), not remove()