Удалите объекты из IEnumerable <T>

У меня есть 2 набора IEnumerable.

IEnumerable<MyClass> objectsToExcept 

и

IEnumerable<MyClass> allObjects.

objectsToExcept может содержать объекты от allObjects.

Я должен удалить из allObjects объекты в objectsToExcept. Например:

foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}

Или

allObject.Except(objectsToExcept)

Но это не работает. Количество после методов имеет, выполняются, указывают, что никакие объекты не были удалены.

45
задан Henk Mollema 30 October 2013 в 16:31
поделиться

3 ответа

Я не понимаю, как будет скомпилирована первая версия, а вторая версия ничего не сделает, если вы не воспользуетесь результатом. Он ничего не удаляет из существующей коллекции - на самом деле, может даже не быть коллекции в памяти, поддерживающей это. Он просто возвращает последовательность, которая при повторении вернет соответствующие значения.

Если вы используете результат, например

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

, тогда все будет нормально , если вы переопределили GetHashCode и Equals или , если вы хотите использовать ссылочное равенство. Вы пытаетесь удалить логически равные значения или одинаковые ссылки встречаются в обеих последовательностях? Вы переопределили GetHashCode и Equals , и если да, то уверены ли вы, что эти реализации работают?

В общем, все должно быть хорошо - я предлагаю вам попробовать создать короткую, но полную программу это демонстрирует проблему; Подозреваю, что при этом вы поймете, что не так.

58
ответ дан 26 November 2019 в 21:03
поделиться

В IEnumerable нет метода Remove , потому что он не предназначен для модификации.

Метод Except не изменяет исходную коллекцию: он возвращает новую коллекцию, не содержащую исключенных элементов:

var notExcluded = allObjects.Except(objectsToExcept);

См. За исключением на MSDN .

29
ответ дан 26 November 2019 в 21:03
поделиться

Remove and Except не изменяют исходный IEnumerable. Возвращают новый. попробуйте

var result = allObject.Except(objectsToexcept);
16
ответ дан 26 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: