Selezionare gli elementi che non desiderate piuttosto che cercare di rimuovere gli elementi che non si desidera. Questo è molto più semplice (e generalmente anche più efficiente) rispetto alla rimozione di elementi.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Volevo pubblicare questo come commento in risposta al commento lasciato da Michael Dillon di seguito, ma è troppo lungo e probabilmente utile per avere comunque nella mia risposta:
Personalmente, non rimuoverei mai gli elementi uno a uno, se hai bisogno di rimuoverli, quindi chiama RemoveAll
che accetta un predicato e riorganizza l'array interno solo una volta, mentre Remove
esegue Array.Copy
un'operazione per ogni elemento rimosso. RemoveAll
è molto più efficiente.
E quando stai iterando all'indietro su un elenco, hai già l'indice dell'elemento che vuoi rimuovere, quindi sarebbe molto più efficiente chiamare RemoveAt
, perché Remove
prima fa un attraversamento dell'elenco per trovare l'indice dell'elemento che stai cercando di rimuovere, ma conosci già quell'indice.
Quindi, tutto sommato, non vedo alcun motivo per mai chiamare Remove
in un for-loop. E idealmente, se possibile, utilizzare il codice sopra per eseguire lo streaming degli elementi dall'elenco in base alle esigenze, quindi non è necessario creare alcuna seconda struttura di dati.