Скажите, что у меня есть запрос LINQ, такой как:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Учитывая, что authorsList
это тип List<Author>
, как я могу удалить Author
элементы authorsList
, которые возвращаются запросом в authors
?
Или, другими словами, как я могу удалить всех равных имени Боба authorsList
?
Примечание. Это упрощенный пример для целей вопроса.
Contains
проверку быстрой и гарантирует, что вы оцените последовательность только один раз.List<T>
, это хорошо, чтобы использовать его.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Было бы лучше использовать List <T> .RemoveAll для достижения этой цели.
источник
Если вам действительно нужно удалить элементы, то как насчет Except ()?
Вы можете удалить на основе нового списка, или удалить на лету, вложив Linq.
источник
Except()
это единственный путь в середине LINQ-оператора.IEnumerable
не имеетRemove()
ниRemoveAll()
.Вы не можете сделать это со стандартными операторами LINQ, потому что LINQ обеспечивает запрос, а не поддержку обновления.
Но вы можете создать новый список и заменить старый.
Или вы можете удалить все предметы
authors
за второй проход.источник
RemoveAll()
не является оператором LINQ.Remove
также является методомList
<T
>, а не методом System.Linq.Enumerable .Простое решение:
источник
Мне было интересно, есть ли разница между
RemoveAll
иExcept
и плюсы использованияHashSet
, поэтому я сделал быструю проверку производительности :)Результаты ниже:
Как мы видим, лучшим вариантом в этом случае является использование
RemoveAll(HashSet)
источник
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
компилируется нормально только к вашему сведениюЭто очень старый вопрос, но я нашел очень простой способ сделать это:
Обратите внимание, что поскольку возвращаемая переменная
authorsList
- этоList<T>
,IEnumerable<T>
возвращаемое значениеExcept()
должно быть преобразовано вList<T>
.источник
Вы можете удалить двумя способами
или
У меня была та же проблема, если вы хотите простой вывод в зависимости от того, где вы находитесь, тогда первое решение лучше.
источник
Скажите, что
authorsToRemove
этоIEnumerable<T>
содержит элементы, которые вы хотите удалить изauthorsList
.Тогда вот еще один очень простой способ выполнить задачу удаления, заданную OP:
источник
Я думаю, что вы могли бы сделать что-то вроде этого
Хотя я думаю, что уже предоставленные решения решают проблему более понятным способом.
источник
Ниже приведен пример удаления элемента из списка.
источник
LINQ берет свое начало в функциональном программировании, которое подчеркивает неизменность объектов, поэтому не предоставляет встроенного способа обновления исходного списка на месте.
Примечание об неизменности (взято из другого ответа SO):
Вот определение неизменности из Википедии .
источник
Я думаю, вам просто нужно назначить элементы из списка авторов в новый список, чтобы применить этот эффект.
источник
Для обеспечения свободного хода кода (если оптимизация кода не имеет решающего значения) и вам необходимо выполнить некоторые дополнительные операции в списке:
или
источник