Zitat: |
dann gibt es keinen Laufzeitfehler und die korrekten Rows werden entfernt. |
Das ist ein Nebeneffekt der konkreten DataGridViewRowCollection Implementierung. Dort entspricht Remove eher einem verstecken. Da wird also nicht wirklich gelöscht womit dann foreach kein Problem hat. Im allgemeinen Fall wird es aber knallen und du versuchst ja eine allgemeine Lösung zu schaffen. Ist da ein wenig unglücklich das DataGridViewRowCollection schon eine sehr ~spezielles~ Konstrukt ist, sich explizit anders verhält und du das als Bespiel Collection benutzt.
Zitat: |
DataGridViewRowCollection oder ControlCollection kennen bei mir kein ToList() oder andere Linq-Methoden |
Weil, wie schon gesagt, DataGridViewRowCollection nicht auf generischen Klassen aufbaut. Und Linq basiert nun mal stark auf Generics. DataGridViewRowCollection gehört zu Winforms und ist damit älter als Generics und kommt ohne aus. Microsoft hat es nie für nötig gehalten das zu aktualisieren womit sich in der Winforms Welt Linq und Konsorten oft genug ein Fremdkörper ist. Die dachten damals schon, so ungefähr 2005, das Winforms alter Quatsch ist.
Zitat: |
Eine neue Liste zu bearbeiten bringt mich nicht weiter, sondern macht es nur komplizierter. |
Das war nicht das wo ich dich hinführen wollte. Eine neue Liste solltest du nur zum iterieren benutzen. Löschen solltest du die in der Original Liste. Auch wenn das 2 Listen sind die Objekte darin sind ja trotzdem die gleichen.
Ein simples
C#-Quelltext
1: 2: 3:
| foreach (var row in rowCollection.ToList()) if (condition.Invoke(row)) rowCollection.Remove(row); |
würde schon reichen. Deiner Feststellung das das nichts bringt würde ich aber in teilen teilen
Mindestens für DataGridViewRowCollection brauchst du bestimmt ein spezielle Lösung. Eine allgemeine Lösung die auch für DataGridViewRowCollection funktioniert wird hässlich.