Selecione os elementos que você não quer, em vez de tentar remover os elementos que você não quer. Isso é muito mais fácil (e geralmente mais eficiente também) do que remover elementos.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Eu queria postar isso como um comentário em resposta ao comentário deixado por Michael Dillon abaixo, mas é muito longo e provavelmente útil para ter em minha resposta de qualquer maneira:
Pessoalmente, eu nunca removeria itens um por um, se você precisar removê-los, em seguida, chamar RemoveAll
que leva um predicado e reorganiza a matriz interna apenas uma vez, enquanto Remove
faz uma Array.Copy
operação para cada elemento que você remove. RemoveAll
é muito mais eficiente.
E quando você está repetindo a iteração sobre uma lista, você já possui o índice do elemento que deseja remover, portanto seria muito mais eficiente chamar RemoveAt
, porque Remove
primeiro é percorrida a lista para encontrar o índice do elemento que você deseja remover. está tentando remover, mas você já conhece esse índice.
Então, apesar de tudo, não vejo motivo para chamar Remove
um loop for. E, idealmente, se for possível, use o código acima para transmitir elementos da lista conforme necessário, para que nenhuma segunda estrutura de dados tenha que ser criada.