C# 枚举时删除datatable中的行时出现问题
当我尝试在循环中删除一行时,出现以下错误 C#:集合已修改;枚举操作不能执行 我已经做了一段时间的研究,我在这里读过一些类似的帖子,但我仍然没有找到正确的答案C# 枚举时删除datatable中的行时出现问题,c#,datatable,C#,Datatable,当我尝试在循环中删除一行时,出现以下错误 C#:集合已修改;枚举操作不能执行 我已经做了一段时间的研究,我在这里读过一些类似的帖子,但我仍然没有找到正确的答案 foreach (DataTable table in JobsDS.Tables) { foreach (DataRow row in table.Rows) { if (row["IP"].ToString() != null && row["IP"].ToString() != "cancelled
foreach (DataTable table in JobsDS.Tables)
{
foreach (DataRow row in table.Rows)
{
if (row["IP"].ToString() != null && row["IP"].ToString() != "cancelled")
{
string newWebServiceUrl = "http://" + row["IP"].ToString() + "/mp/Service.asmx";
webService.Url = newWebServiceUrl;
string polledMessage = webService.mpMethod(row["IP"].ToString(), row["ID"].ToString());
if (polledMessage != null)
{
if (polledMessage == "stored")
{
removeJob(id);
}
}
}
}
}
如果您有任何帮助,我们将不胜感激不要使用
foreach
,而是使用反向for
循环:
for(int i = table.Rows.Count - 1; i >= 0; i--)
{
DataRow row = table.Rows[i];
//do your stuff
}
删除该行确实会修改原始行集合。大多数枚举器被设计成如果发现源序列在枚举中间发生了变化而爆炸,而不是试图处理代码“>前缀 ING的所有奇怪的可能性。更安全的做法是干脆不允许它。您不能在其周围的
foreach
中修改集合
相反,应该使用向后的
for
循环。如果要从元素列表的循环中删除元素,技巧是使用for循环,从最后一个元素开始,然后转到第一个元素
在您的示例中:
int t_size = table.Rows.Count -1;
for (int i = t_size; i >= 0; i--)
{
DataRow row = table.Rows[i];
// your code ...
}
编辑:不够快:)另外,如果您依赖于处理行的顺序,并且反向循环对您不起作用。可以将要删除的行添加到列表中,然后在退出foreach循环后,可以删除添加到列表中的行。比如说,
foreach (DataTable table in JobsDS.Tables)
{
List<DataRow> rowsToRemove = new List<DataRow>();
foreach (DataRow row in table.Rows)
{
if (row["IP"].ToString() != null && row["IP"].ToString() != "cancelled")
{
string newWebServiceUrl = "http://" + row["IP"].ToString() + "/mp/Service.asmx";
webService.Url = newWebServiceUrl;
string polledMessage = webService.mpMethod(row["IP"].ToString(), row["ID"].ToString());
if (polledMessage != null)
{
if (polledMessage == "stored")
{
//removeJob(id);
rowsToRemove.Add(row);
}
}
}
}
rowsToRemove.ForEach(r => removeJob(r["ID"].ToString()));
}
foreach(jobsd.Tables中的数据表)
{
List rowsToRemove=新列表();
foreach(table.Rows中的DataRow行)
{
if(行[“IP”].ToString()!=null和行[“IP”].ToString()!=“已取消”)
{
字符串newWebServiceUrl=“http://”+行[“IP”].ToString()+“/mp/Service.asmx”;
Url=newWebServiceUrl;
字符串polledMessage=webService.mpMethod(第[“IP”].ToString()行,第[“ID”].ToString()行);
if(polledMessage!=null)
{
如果(轮询消息==“已存储”)
{
//removeJob(id);
rowsToRemove.Add(行);
}
}
}
}
rowsToRemove.ForEach(r=>removeJob(r[“ID”].ToString());
}
以某种方式removeJob(id)
更改了枚举中的一个IEnumerables(table.Rows
或JobsDS.Tables
,从方法名称来看,我想应该是后者),可能是通过数据绑定
我不确定的向后
是否能直接工作,因为您似乎正在从内部foreach中删除外部foreach中枚举的元素。如果没有更多关于removeJob(id)中发生了什么的信息,很难说出来。@SLaks我认为它和你的评论没有什么不同