var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Quando você não tiver certeza de que o item realmente existe, poderá usar o SingleOrDefault . SingleOrDefaultretornará nullse não houver nenhum item ( Singlelançará uma exceção quando não conseguir encontrar o item). Ambos serão lançados quando houver um valor duplicado (dois itens com o mesmo id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
Ele removerá os itens 2 e 3 e manterá os itens 1 e 4 - conforme especificado pelo removeList. Observe que isso acontece no local, portanto, não há atribuição adicional necessária.
Obviamente, você também pode usá-lo em itens únicos como:
results.RemoveAll(r => r.ID==4);
onde ele removerá o projeto de lei com o ID 4 em nosso exemplo.
Outra abordagem semelhante (que usa um predicado) é usar List.FindIndex/ List.RemoteAt(que possui o recurso "bom" ou "não tão bom" de ser uma operação de mutação).
É verdade, mas tenha cuidado ao dizer que a operação da List está mudando. Lista usa uma matriz nos bastidores e pode recriar sua matriz com uma capacidade menor ou maior quando achar necessário. Normalmente , a remoção é uma mutação no local da matriz existente.
Keith
Este segmento seguro não é, e por sua simplicidade você pode apenas usar SingleOrDefault, ele does not necessidade de ser contido em um método estático
Ninguém disse que era seguro para threads (e se depende do que os threads deveriam estar fazendo; pode ser preferível fornecer uma construção de memória diferente para um thread de trabalho, em vez de permitir que todos trabalhem em uma coleção simultânea ) e o OP deseja todos os registros, exceto o correspondente ao predicado, para que SingleOrDefault retorne exatamente o que eles não desejam. O "método estático" é de fato um método de extensão, como a maioria do Linq, e funciona sempre que o que você não deseja (um elemento ou muitos) é mais fácil de definir do que o que você faz.
Keiths
5
Existe outra abordagem. Ele usa List.FindIndexe List.RemoveAt.
Embora eu provavelmente usasse a solução apresentada pelo KeithS (apenas o simples Where/ ToList), essa abordagem difere porque muda o objeto da lista original. Isso pode ser um "recurso" bom (ou ruim), dependendo das expectativas.
Em qualquer caso, o FindIndex(acoplado a uma proteção) garante que a RemoveAtcorreção estará correta se houver lacunas nos IDs ou se a ordem estiver errada etc., e o uso de RemoveAt(vs Remove) evita uma segunda pesquisa de O (n) na lista.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Resposta curta:
Remover (da lista
results
)results.RemoveAll(r => r.ID == 2);
irá remover o item com ID 2 emresults
(no local).Filtro (sem remover da lista original
results
):var filtered = result.Where(f => f.ID != 2);
retorna todos os itens, exceto aquele com ID 2Resposta detalhada:
Eu acho que
.RemoveAll()
é muito flexível, porque você pode ter uma lista de IDs de itens que deseja remover - considere o exemplo a seguir.Se você tem:
e atribuiu alguns valores da
results
seguinte maneira:Em seguida, você pode definir uma lista de IDs para remover:
E simplesmente use isso para removê-los:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Ele removerá os itens 2 e 3 e manterá os itens 1 e 4 - conforme especificado pelo
removeList
. Observe que isso acontece no local, portanto, não há atribuição adicional necessária.Obviamente, você também pode usá-lo em itens únicos como:
onde ele removerá o projeto de lei com o ID 4 em nosso exemplo.
DotNetFiddle: Execute a demonstração
fonte
Gosto de um pouco de ajuda do Linq que é fácil de implementar e pode fazer consultas com condições "onde não" um pouco mais fáceis de ler:
fonte
List.FindIndex
/List.RemoteAt
(que possui o recurso "bom" ou "não tão bom" de ser uma operação de mutação).Existe outra abordagem. Ele usa
List.FindIndex
eList.RemoveAt
.Embora eu provavelmente usasse a solução apresentada pelo KeithS (apenas o simples
Where
/ToList
), essa abordagem difere porque muda o objeto da lista original. Isso pode ser um "recurso" bom (ou ruim), dependendo das expectativas.Em qualquer caso, o
FindIndex
(acoplado a uma proteção) garante que aRemoveAt
correção estará correta se houver lacunas nos IDs ou se a ordem estiver errada etc., e o uso deRemoveAt
(vsRemove
) evita uma segunda pesquisa de O (n) na lista.Aqui está um trecho de LINQPad :
Feliz codificação.
fonte
Você não especifica que tipo de lista, mas a Lista genérica pode usar o
RemoveAt(index)
método ou oRemove(obj)
método:fonte
Mais simplificado:
não há necessidade de criar um novo objeto var.
fonte
... ou apenas
resultlist.RemoveAt(1)
se você souber exatamente o índice.fonte
fonte