Estou tentando descobrir como percorrer uma lista genérica de itens que quero remover de outra lista de itens.
Então, digamos que eu tenho isso como um exemplo hipotético
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Desejo percorrer a lista1 com um foreach e remover cada item da lista1, que também está contido na lista2.
Não sei bem como proceder, pois o foreach não é baseado em índices.
list1
existentes emlist2
ou deseja remover os itenslist2
existenteslist1
? No momento deste comentário, cada resposta fornecida executará a última.Respostas:
Você pode usar Exceto :
Você provavelmente nem precisa dessas variáveis temporárias:
Observe que
Except
não modifica nenhuma das listas - ele cria uma nova lista com o resultado.fonte
IEnumerable<car>
, não umList<car>
. Você precisa ligarToList()
para obter uma lista de volta. Além disso, acredito que deveria serGetSomeOtherList().Except(GetTheList()).ToList()
using System.Linq;
se não o tiver antes.Except
pois isso realmente executa uma operação definida , que distingue a lista resultante. Eu não estava esperando esse comportamento, pois estou usando aList
, não aHashSet
. Relacionado.Você não precisa de um índice, pois a
List<T>
classe permite remover itens por valor, em vez de indexar usando aRemove
funçãofonte
list2.Remove(item);
declaração.list1.ForEach(c => list2.Remove(c));
Eu recomendaria o uso dos métodos de extensão LINQ . Você pode fazer isso facilmente com uma linha de código da seguinte maneira:
Isso supõe, é claro, que os objetos na lista1 que você está removendo da lista2 sejam da mesma instância.
fonte
No meu caso, eu tinha duas listas diferentes, com um identificador comum, como uma chave estrangeira. A segunda solução citada por "nzrytmn" :
Foi o que melhor se encaixou na minha situação. Eu precisava carregar um DropDownList sem os registros que já haviam sido registrados.
Obrigado !!!
Este é o meu código:
fonte
Você poderia usar o LINQ, mas eu usaria o
RemoveAll
método Eu acho que é o que melhor expressa sua intenção.fonte
fonte
O(N)
, isso levará aO(N^2)
que pode haver um problema com listas grandes.Solução 1: Você pode fazer assim:
Mas, em alguns casos, essa solução pode não funcionar. se não funcionar, você pode usar minha segunda solução.
Solução 2:
fingimos que list1 é sua lista principal e list2 é sua lista secundária e você deseja obter itens da lista1 sem itens da lista2.
fonte
Como
Except
não modifica a lista, você pode usar o ForEach emList<T>
:Pode não ser a maneira mais eficiente, mas é simples, portanto legível, e atualiza a lista original (que é meu requisito).
fonte
Aqui você vai ..
fonte