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
答案 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;
}
通过反向遍历收藏品,您确信即使在中途移除某些商品,您也不会跳过任何商品。