У меня есть 2 набора IEnumerable.
IEnumerable<MyClass> objectsToExcept
и
IEnumerable<MyClass> allObjects.
objectsToExcept
может содержать объекты от allObjects
.
Я должен удалить из allObjects
объекты в objectsToExcept
. Например:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Или
allObject.Except(objectsToExcept)
Но это не работает. Количество после методов имеет, выполняются, указывают, что никакие объекты не были удалены.
Я не понимаю, как будет скомпилирована первая версия, а вторая версия ничего не сделает, если вы не воспользуетесь результатом. Он ничего не удаляет из существующей коллекции - на самом деле, может даже не быть коллекции в памяти, поддерживающей это. Он просто возвращает последовательность, которая при повторении вернет соответствующие значения.
Если вы используете результат, например
IEnumerable<MyClass> others = allObjects.Except(objectsToExcept);
foreach (MyClass x in others)
{
...
}
, тогда все будет нормально , если вы переопределили GetHashCode
и Equals
или , если вы хотите использовать ссылочное равенство. Вы пытаетесь удалить логически равные значения или одинаковые ссылки встречаются в обеих последовательностях? Вы переопределили GetHashCode
и Equals
, и если да, то уверены ли вы, что эти реализации работают?
В общем, все должно быть хорошо - я предлагаю вам попробовать создать короткую, но полную программу это демонстрирует проблему; Подозреваю, что при этом вы поймете, что не так.
В IEnumerable
нет метода Remove
, потому что он не предназначен для модификации.
Метод Except
не изменяет исходную коллекцию: он возвращает новую коллекцию, не содержащую исключенных элементов:
var notExcluded = allObjects.Except(objectsToExcept);
См. За исключением
на MSDN .
Remove and Except не изменяют исходный IEnumerable. Возвращают новый. попробуйте
var result = allObject.Except(objectsToexcept);