Usuário com melhor resposta
Coleção foi modificada; talvez a operação de enumeração não seja executada.

Pergunta
-
Estou recebendo essa exception, na linha de remoção.
A exceção é: Coleção foi modificada; talvez a operação de enumeração não seja executada.Há alguma maneira de remover itens de uma lista que eu já filtrei?
static void Main(string[] args)
{
IList<Cliente> lista = new List<Cliente>();
lista.Add(new Cliente { ID = 1, Nome = "Hélio" });
lista.Add(new Cliente { ID = 2, Nome = "Maria" });
lista.Add(new Cliente { ID = 3, Nome = "José" });
var novaLista = from cliente in lista
where cliente.ID == 1
select cliente
;
foreach(Cliente item in novaLista)
{
lista.Remove(item);
}
Console.ReadKey();
}
Hélio
Respostas
-
Existem sim forma de excluir items de uma lista, de qualquer lista!
Exemplo (exclusivamente no seu caso)
1)
IList<Cliente> lista = new List<Cliente>(); lista.Add(new Cliente { ID = 1, Nome = "Hélio" }); lista.Add(new Cliente { ID = 2, Nome = "Maria" }); lista.Add(new Cliente { ID = 3, Nome = "José" }); var novaLista = (from cliente in lista where cliente.ID == 1 select cliente).ToList(); novaLista.RemoveAt(0); Console.ReadKey();
Ou seja, um ToList() no final da instrução e um RemoveAt(0) que é único elemento dessa lista removerá esse objeto !!! Esse tipo que você utilizou com ForEach não é o ideal para remoção de itens de uma coleção.
2)
List<Cliente> novaLista = (from cliente in lista where cliente.ID == 1 select cliente) .ToList(); novaLista.RemoveAll(x => x.ID == 1);
Apesar que não minha visão é errado fazer um filtro depois outro filtro para excluir! mas, em algum momento você pode utilizar isso...
Tudo depende do que você deseja implementar!
Fulvio C
- Editado Fulvio Cezar Canducci Dias segunda-feira, 7 de março de 2016 15:40
- Marcado como Resposta Marcos SJ terça-feira, 15 de março de 2016 20:06
Todas as Respostas
-
-
Existem sim forma de excluir items de uma lista, de qualquer lista!
Exemplo (exclusivamente no seu caso)
1)
IList<Cliente> lista = new List<Cliente>(); lista.Add(new Cliente { ID = 1, Nome = "Hélio" }); lista.Add(new Cliente { ID = 2, Nome = "Maria" }); lista.Add(new Cliente { ID = 3, Nome = "José" }); var novaLista = (from cliente in lista where cliente.ID == 1 select cliente).ToList(); novaLista.RemoveAt(0); Console.ReadKey();
Ou seja, um ToList() no final da instrução e um RemoveAt(0) que é único elemento dessa lista removerá esse objeto !!! Esse tipo que você utilizou com ForEach não é o ideal para remoção de itens de uma coleção.
2)
List<Cliente> novaLista = (from cliente in lista where cliente.ID == 1 select cliente) .ToList(); novaLista.RemoveAll(x => x.ID == 1);
Apesar que não minha visão é errado fazer um filtro depois outro filtro para excluir! mas, em algum momento você pode utilizar isso...
Tudo depende do que você deseja implementar!
Fulvio C
- Editado Fulvio Cezar Canducci Dias segunda-feira, 7 de março de 2016 15:40
- Marcado como Resposta Marcos SJ terça-feira, 15 de março de 2016 20:06
-
-
-
bom... consegui usando o tolist
var novaLista = (from cliente in lista
where cliente.ID == 1
select cliente).ToList()
;Parece que da forma anterior o linq está gerando uma referência para novaLista, já usando toList a atribuição vai por valor e não por referência
Hélio