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, RemoveAll
które bierze predykat i tylko raz przestawia wewnętrzną tablicę, podczas gdy Remove
wykonuje Array.Copy
operację dla każdego usuwanego elementu.RemoveAll
jest 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ż Remove
najpierw 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ć Remove
pę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.