Remove items from IEnumerable<T>

c#, ienumerable, linq

Solution

I don't see how the first version would compile, and the second version won't do anything unless you use the result. It doesn't remove anything from the existing collection - indeed, there may not even be an in-memory collection backing it. It just returns a sequence which, when iterated over, will return the appropriate values.

If you are using the result, e.g.

IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
    ...
}

then it should be fine if you've overridden `GetHashCode` and `Equals` or if you're happy to use reference equality. Are you trying to remove logically-equal values, or do the same references occur in both sequences? Have you overridden `GetHashCode` and `Equals`, and if so, are you sure those implementations work?

Basically it should be fine - I suggest you try to create a short but complete program that demonstrates the problem; I suspect that while doing so, you'll find out what's wrong.

Problem

I have 2 IEnumerable collections. ``` IEnumerable<MyClass> objectsToExcept ``` and ``` IEnumerable<MyClass> allObjects. ``` `objectsToExcept` may contain objects from `allObjects`. I need to remove from `allObjects` objects in `objectsToExcept`. For example: ``` foreach (var myClass in objectsToExcept) { allObjects.Remove(myClass); } ``` Or ``` allObject.Except(objectsToExcept) ``` But it doesn't work. The count after the methods have execute indicate that no items have been removed.

Original source