Problem entfernen Zeile datatable, während auflisten
Bekomme ich die folgende Fehlermeldung, während ich versuche, eine Zeile zu löschen, während die Schleife durch Sie.
C#: die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt
Habe ich getan einige der Forschung, für eine Weile, und ich habe einige ähnliche Beiträge hier, aber ich habe noch nicht die richtige Antwort.
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);
}
}
}
}
}
jegliche Hilfe würde sehr geschätzt werden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anstatt
foreach
verwenden Sie einen reverse -for
Schleife:Entfernen Sie die Zeile in der Tat ändert die ursprüngliche Sammlung von Zeilen. Die meisten Zähler sind entworfen, um zu explodieren, wenn Sie erkennen der Quell-Sequenz hat sich in der Mitte einer Aufzählung - anstatt zu versuchen, mit all den seltsamen Möglichkeiten der
foreach
ing über etwas zu ändern ist und wahrscheinlich vorstellen sehr subtile bugs, ist es sicherer, einfach verweigern.Können Sie nicht ändern, eine Sammlung innerhalb einer
foreach
um ihn herum.Verwenden Sie stattdessen eine rückwärts
for
Schleife.Wenn Sie möchten, entfernen von Elementen aus einer Schleife über eine Liste der Elemente, der trick ist, eine for-Schleife verwenden, starten Sie vom letzten Element und gehe auf das erste Element.
In deinem Beispiel :
Edit : nicht schnell genug 🙂
t_size
variable.Auch, wenn Sie hängen von der Reihenfolge ab, die Sie verarbeiten die Zeilen-und einer Rückseite, Schleife wird nicht für Sie arbeiten. Sie können fügen Sie die Zeilen, die Sie löschen möchten, in eine Liste und dann, nach dem beenden der foreach-Schleife können Sie löschen Sie die Zeilen der Liste Hinzugefügt. Zum Beispiel,
Irgendwie
removeJob(id)
änderungen einer der IEnumerables Ihrer Aufzählung (table.Rows
oderJobsDS.Tables
, aus dem Namen der Methode, die ich denke, es wäre das letztere), vielleicht per DataBinding.Ich bin nicht sicher, dass die rückwärts
for
geht das direkt, weil es scheint, Sie sind das entfernen eines Elements aufgelistet in der äußeren foreach innerhalb der inneren foreach. Es ist schwer zu sagen ohne mehr info über das, was passiert in removeJob(id).