Wybierz elementy, które chcesz, zamiast próbować usunąć elementy, których nie chcesz. Jest to o wiele łatwiejsze (i ogólnie także bardziej wydajne) niż usuwanie elementów.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Chciałem opublikować to jako komentarz w odpowiedzi na komentarz pozostawiony przez Michaela Dillona poniżej, ale i tak jest on zbyt długi i prawdopodobnie przydatny w mojej odpowiedzi:
Osobiście nigdy nie usuwałbym elementów jeden po drugim, jeśli potrzebujesz usunięcia, to wywołanie, RemoveAllktóre bierze predykat i tylko raz przestawia wewnętrzną tablicę, podczas gdy Removewykonuje Array.Copyoperację dla każdego usuwanego elementu.RemoveAlljest znacznie wydajniejszy.
A gdy iterujesz wstecz po liście, masz już indeks elementu, który chcesz usunąć, więc wywołanie byłoby znacznie bardziej wydajne RemoveAt, ponieważ Removenajpierw przegląda listę, aby znaleźć indeks elementu, który próbuję usunąć, ale znasz już ten indeks.
Podsumowując, nie widzę powodu, aby kiedykolwiek wywoływać Removepętlę for. I najlepiej, jeśli jest to w ogóle możliwe, użyj powyższego kodu, aby przesyłać strumieniowo elementy z listy w razie potrzeby, aby w ogóle nie trzeba było tworzyć drugiej struktury danych.