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.
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.