terça-feira, 27 de maio de 2008

Collection was modified; enumeration operation may not execute

Olá Amigos,

Tenho duas listas relacionadas (tópicos,respostas), preciso remover todas as respostas relacionadas a um determinado tópico.

O primeiro código que vem a cabeça é fazer um for each e deletar item por item.

Como no exemplo abaixo:

SPQuery q = new SPQuery();
q.Query = "<Where><Eq><FieldRef Name='Topico' /><Value Type='Lookup'>" + sTopico + "</Value></Eq></Where>";

SPList listRespostas = SPContext.Current.Web.Lists["Respostas"];
SPListItemCollection itensTopicos = listRespostas.GetItems(q);

foreach (SPListItem itemResposta in itensTopicosFake)
{
itemResposta.Delete();
}

Porém quando executamos este código, nos deparamos com o seguinte erro.

Collection was modified; enumeration operation may not execute

Este erro acontece porque a collection que eu estou usando no for each, está sendo modificada dentro dele mesmo.

Para resolver este problema substitui o for each pelo while abaixo.

while (itensTopicos.Count > 0)
itensTopicos[0].Delete();

Abraços,
Leonardo

6 comentários:

Jackson Silva Cruz disse...

Opa dica valida, grato pela ajuda!

Anônimo disse...

Valeu me ajudou também!!
Valeu!

Thiago disse...

Outro jeito de fazer isso seria criando um clone do objeto a ser varrido usando o .toList()...

Desta maneira:
foreach (SPListItem itemResposta in itensTopicosFake.toList())
{...}

Valeu!

Eduardo disse...

vlw pela dica amigo, ajudou bastante.

Eduardo
Curitiba

Tinti disse...

Me ajudou também, fiz algo parecido:
-----------
int i = 0;

while (i < filaDeArquivosParaChecar.Count){

if (Posso apagar o registro na posicao i){
filaDeArquivosParaChecar.Remove(filaDeArquivosParaChecar.ElementAt(i));
//volto com o i para zero para voltar a olhar a fila do começo agora que um elemento foi apagado (no caso da minha aplicação a maior parte das vezes eh o primeiro elemento da fila mesmo, se não poderia ser algo do tipo i = i -1; para voltar uma posicao
i = 0;
}
else
{
i++;
}
}

Unknown disse...

Vlw me ajudou bastante tb...