none
Coleção foi modificada; talvez a operação de enumeração não seja executada. RRS feed

  • 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

    segunda-feira, 7 de março de 2016 14:59

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


    segunda-feira, 7 de março de 2016 15:32

Todas as Respostas

  • Provavelmente porque você está removendo da lista em loop.

    porque no where você não coloca !=, assim monta uma nova lista sem o item que você quer!

    segunda-feira, 7 de março de 2016 15:24
  • 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


    segunda-feira, 7 de março de 2016 15:32
  • Lembrando que menos em um loop, já que vai interferir na lista no momento da interação!
    segunda-feira, 7 de março de 2016 15:34
  • eu preciso retirar da primeira lista o que foi obtido para a novaLista.

    Hélio

    segunda-feira, 7 de março de 2016 17:01
  • 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

    segunda-feira, 7 de março de 2016 17:07