entfernen von Elementen aus einer generischen List<t>
Habe ich die folgende Methode, ich wünschte, so entfernen Sie Elemente aus meiner Sammlung, die mit der Produkt-Id. Scheint ziemlich geradlinig, aber ich bekomme eine exception. Im Grunde meine Sammlung ist immer out of sync. Also, was ist der beste Weg, um entfernen Sie ein Element aus einer Sammlung.
public void RemoveOrderItem(Model.Order currentOrder, int productId)
{
foreach (var orderItem in currentOrder.OrderItems)
{
if (orderItem.Product.Id == productId)
{
currentOrder.OrderItems.Remove(orderItem);
}
}
}
Exception Details: System.InvalidOperationException: die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt
InformationsquelleAutor frosty | 2010-06-08
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern einer collection in einer Schleife funktioniert nicht. Um zu umgehen, dass
List
hat ein paar Methoden, mit denen "batch" - änderungen in der Sammlung. In Ihrem Fall, verwenden Sie:Können Sie nicht ändern, eine Sammlung während der Iteration es. Verwenden Sie einfach eine normale
for
- Schleife statt einerforeach
Schleife.Per Schleife diese Weise können Sie nicht entfernen Sie Gegenstände, weil seine in der Sammlung, es hält die Spur von der gespeicherten Elemente.
Einfache Möglichkeit, dies zu tun :
oder
Können Sie nicht entfernen Sie ein Element aus einer Sammlung, die Sie Durchlaufen, Sie konnte verfolgen, orderItem, dann entfernen Sie es, nachdem Sie fertig sind, Schleife
Als Sie begreifen, dass Sie nicht entfernen Sie ein Element aus einer Sammlung, während Sie Durchlaufen es. Ich bin sicher, jemand wird in der Lage sein, um eine rasche und reibungslose LINQ-Lösung, aber die folgenden sollten Sie loslegen, zunächst:
List<T>.RemoveAll
verfügbar ist .NET 2.0 und ist technisch nicht LINQ, obwohl es ähnlich sieht. Das ist ein großes plus über LINQ für die Armen Seelen, die Sie zu pflegen haben Windows 2000-Kompatibilität."foreach" bietet ein "Forward-only read-only" iteration einer Sammlung.
Als Problemumgehung können Sie kopieren Sie die Referenz zu einer anderen Sammlung, und iteriere auf die kopierte Sammlung und entfernen Sie die Elemente aus dem original.