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 RemoveAllche accetta un predicato e riorganizza l'array interno solo una volta, mentre Removeesegue Array.Copyun'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é Removeprima 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 Removein 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.