Digamos que eu tenha uma consulta LINQ, como:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Dado que authorsList
é do tipo List<Author>
, como posso excluir os Author
elementos deauthorsList
retornados pela consulta em authors
?
Ou, dito de outra maneira, como posso excluir todos os nomes iguais a Bob de authorsList
?
Nota: Este é um exemplo simplificado para os propósitos da pergunta.
Contains
verificação rápida e garante que você avalie a sequência apenas uma vez.List<T>
, é bom usá-lo.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Seria melhor usar List <T> .RemoveAll para fazer isso.
fonte
Se você realmente precisa remover itens, o que acontece com Except ()?
Você pode remover com base em uma nova lista ou remover rapidamente, aninhando o Linq.
fonte
Except()
é o único caminho a percorrer no meio da instrução LINQ.IEnumerable
não temRemove()
nemRemoveAll()
.Você não pode fazer isso com operadores LINQ padrão porque o LINQ fornece consulta, não atualização de suporte.
Mas você pode gerar uma nova lista e substituir a antiga.
Ou você pode remover todos os itens
authors
em uma segunda passagem.fonte
RemoveAll()
não é um operador LINQ.Remove
também é um métodoList
<T
>, não um método System.Linq.Enumerable .Solução simples:
fonte
Fiquei me perguntando, se há alguma diferença entre
RemoveAll
eExcept
e os profissionais de usarHashSet
, então eu fiz uma rápida verificação de desempenho :)Resultados abaixo:
Como podemos ver, a melhor opção nesse caso é usar
RemoveAll(HashSet)
fonte
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
compila bem apenas FYIEsta é uma pergunta muito antiga, mas achei uma maneira muito simples de fazer isso:
Observe que, como a variável de retorno
authorsList
é aList<T>
, aIEnumerable<T>
retornada porExcept()
deve ser convertida em aList<T>
.fonte
Você pode remover de duas maneiras
ou
Eu tive o mesmo problema, se você deseja uma saída simples com base em sua condição where, a primeira solução é melhor.
fonte
Digamos que
authorsToRemove
seja umIEnumerable<T>
que contenha os elementos dos quais você deseja removerauthorsList
.Aqui está outra maneira muito simples de realizar a tarefa de remoção solicitada pelo OP:
fonte
Eu acho que você poderia fazer algo assim
Embora eu ache que as soluções já fornecidas resolvam o problema de maneira mais legível.
fonte
Abaixo está o exemplo para remover o elemento da lista.
fonte
O LINQ tem suas origens na programação funcional, que enfatiza a imutabilidade de objetos, portanto, não fornece uma maneira integrada de atualizar a lista original no local.
Nota sobre imutabilidade (extraída de outra resposta do SO):
Aqui está a definição de imutabilidade da Wikipedia .
fonte
Eu acho que você só precisa atribuir os itens da lista de autores a uma nova lista para ter esse efeito.
fonte
Para manter o código fluente (se a otimização do código não for crucial) e você precisar executar algumas operações adicionais na lista:
ou
fonte