集合被修改枚举操作可能无法使用foreach循环执行

时间:2018-02-23 06:35:23

标签: c# foreach datatable datarow

DataRow.Delete()在一种方法中正常工作,但在另一种方法中无效。

//Working method
public static bool finalThrustHDForce(int startPoint, int nPlotSelection)
{
    int startVal = 1;
    try
    {
        foreach (DataRow dr in dtThrustCalc.Rows)
        {
            if ((startVal = Convert.ToInt32(dr[ThrustCalculation.pathLength]) - startPoint) < 0)
                dr.Delete();
            else
                dr[ThrustCalculation.pathLength] = startVal;
        }
        dtThrustCalc.AcceptChanges();
        calculateBreadkDown();
        calculateCriticalPoints(nPlotSelection);
    }
    catch (Exception ex) { ex.Log(); return false; }
    return true;
}
// not working , getting error collection was modified enumeration operation //might not execute

2 个答案:

答案 0 :(得分:1)

错误告诉您,使用foreach迭代的事物集合已在该循环中进行了修改。考虑不要在那时删除它,并列出要删除的内容。然后在foreach完成后删除那些东西。

答案 1 :(得分:0)

原因

您正在获取该消息,因为使用foreach枚举集合要求在枚举完成之前不会更改集合(即不添加或删除元素)。通过从集合中删除数据行,您违反了此要求,从而违反了错误。

解决方案

创建要删除的项目列表,然后在完成第一次迭代后删除它们。

var toDelete = new List<DataRow>();

foreach (DataRow dr in dtThrustCalc.Rows)
{
    if ((startVal = Convert.ToInt32(dr[ThrustCalculation.pathLength]) - startPoint) < 0)
        toDelete.Add(dr);
    else
        dr[ThrustCalculation.pathLength] = startVal;
}

foreach (var dr in toDelete)
    dtThrustCalc.Rows.Remove(dr); // not so sure of this as I'm using my phone

此方法使用更多内存来存储要删除的项目的缓存。

另一种方法是使用反向for循环并在遇到它们时删除它们。

for (var i = dtThrustCalc.Rows.Count - 1; i >= 0; i--)
{
    var dr = dtThrustCalc[i];
    if ((startVal = Convert.ToInt32(dr[ThrustCalculation.pathLength]) - startPoint) < 0)
        dr.Delete();
    else
        dr[ThrustCalculation.pathLength] = startVal;
}

通过反向遍历收藏品,您确信即使在中途移除某些商品,您也不会跳过任何商品。