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