Выберите элементы, которые вы делаете хотите, вместо того, чтобы пытаться удалить элементы, которые вы не хотите. Это намного проще (и вообще более эффективно), чем удаление элементов.
var newSequence = (from el in list
where el.Something || el.AnotherThing < 0
select el);
Я хотел опубликовать это как комментарий в ответ на комментарий, оставленный Майклом Диллоном ниже, но это слишком долго и, вероятно, полезно в моем ответе в любом случае:
Лично я никогда не удаляю элементы по одному, если вам нужно удалить, а затем позвонить RemoveAll который принимает предикат и только один раз переставляет внутренний массив, тогда как Removeвыполняет Array.Copyоперацию для каждого удаляемого элемента. RemoveAllзначительно эффективнее
И когда вы перебираете список в обратном направлении, у вас уже есть индекс элемента, который вы хотите удалить, поэтому было бы гораздо эффективнее вызвать его RemoveAt, потому что Removeсначала выполняется обход списка, чтобы найти индекс элемента, который вы хотите удалить. Пытаюсь удалить, но вы уже знаете этот индекс.
Итак, в общем, я не вижу никакой причины когда-либо вызывать Removeцикл for. И в идеале, если это вообще возможно, используйте приведенный выше код для потоковой передачи элементов из списка по мере необходимости, чтобы вообще не нужно было создавать вторую структуру данных.