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