You can't do this. From the docs for IEnumerator<T>:
An enumerator remains valid as long as
the collection remains unchanged. If
changes are made to the collection,
such as adding, modifying, or deleting
elements, the enumerator is
irrecoverably invalidated and its
behavior is undefined.
Alternatives are:
- Build up a new list of items to remove, then remove them all afterwards
- Use a normal "for" loop and make sure you're careful about not going over the same element twice or missing any out. (You've said you don't want to do this, but what you're trying to do just won't work.)
- Build a new collection containing only the elements you want to retain
The last of these alternatives is the LINQ-like solution, where you'd typically write:
var newList = oldList.Where(x => ShouldBeRetained(x)).ToList();
(Where ShouldBeRetained
is whatever logic you want, of course.) The call to ToList()
is only necessary if you actually want it in a list. This leads to more declarative code which is often easier to read. I can't easily guess what your original loop is meant to do (it seems pretty odd at the moment) whereas if you can express the logic purely in terms of the item, it can be a lot clearer.