Чистый, читаемый способ сделать это следующим образом (я предполагаю, что API стороннего контейнера здесь, так как вы его не указали.)
foreach(var delItem in ThirdPartyContainer.Items
.Where(item=>ShouldIDeleteThis(item))
//or: .Where(ShouldIDeleteThis)
.ToArray()) {
ThirdPartyContainer.Remove(delItem);
}
Вызов .ToArray()
гарантирует, что все элементы, подлежащие удалению, были жадно кэшированы до начала итерации foreach.
За кулисами это включает в себя массив и дополнительную итерацию, но это, как правило, очень дешево, и преимущество этого методав отличие от других ответов на этот вопрос, он работает с простыми перечислимыми и не включает в себя сложные проблемы изменяемого состояния, которые трудно прочитать и легко ошибиться.
В отличие от этого, итерация в обратном порядке, хотя и не ракетостроение, гораздо более склонна к ошибкам и труднее читать;и он также опирается на внутренние элементы коллекции, такие как неизменный порядок между удалениями (например, лучше не быть двоичной кучей, скажем).Ручное добавление элементов, которые должны быть удалены во временный список, является просто ненужным кодом - вот что .ToArray () прекрасно подойдет: -).