DELETAR ITENS DA LIST<T> COM FOREACH

PERCIFILHO 15/04/2016 08:21:52
#460948
Boa dia, pessoal.
Estou tentando deletar os itens de uma List<T>, de maneira que os registros da tabela são mostrados num DataGridView com coluna check.
O usuário escolherá os registros a serem deletados. Então, eu percorro a grid, verifico se o check está true, então eu deleto o item da List<T>, correto?
Estou fazendo assim:


lista_pessoa = new List<Pessoa>(new Pessoa().GetAll()); // cria a lista
for (int i = 0; i < dgvPessoas.Rows.Count; i++) // percorre a grid
{
int pos = lista_pessoa.IndexOf(lista_pessoa.FirstOrDefault(x => x.Id.ToString() == dgvPessoas.Rows[i].Cells[[Ô]Id[Ô]].Value.ToString())); // pega o índice do item
if (dgvPessoa.Rows[i].Cells[[Ô]check[Ô]].Value.Equals(true)) // verifica se a coluna check está marcada
{
foreach (var item in lista_pessoa)
{
string v_id = lista_pessoa[pos].Id.ToString();
var excluiregistro = new Pessoa(Convert.ToInt32(v_id));
excluiregistro.Delete();
lista_pessoa.Remove(item);
}
}
}


Só que ao percorrer o ForEach, aparece a mensagem que a coleção foi modificada, e a operação não pede ser executada.
Não sei se esse é o jeito correto de se fazer o que eu estou querendo, se alguém puder me corrigir, agradeço.
Lembrando que não estou usando o DataBinding para preencher o DataGridView.
PERCIFILHO 15/04/2016 09:34:49
#460957
Bem, como eu disse, não sei se é a maneira correta de se fazer isso, mas consegui, alterando algumas coisas:

lista_pessoa = new List<Pessoa>(new Pessoa().GetAll());
var resul = lista_pessoa.Where(x => x.Cidade == [Ô]Matão[Ô] && x.Ativo == [Ô]SIM[Ô]);
foreach (var item in lista_pessoa)
{
for (int i = 0; i < dgvPessoas.Rows.Count; i++)
{
if (dgvPessoas.Rows[i].Cells[[Ô]check[Ô]].Value.Equals(true))
{
if (item.Id.ToString() == dgvPessoas.Rows[i].Cells[[Ô]id[Ô]].Value.ToString())
{
var excluiregistro = new Pessoa(Convert.ToInt32(item.Id));
excluiregistro.Delete();
}
}
}
}


Funcionou. Vou deixar o tópico aberto para se alguém quiser comentar algo ou tiver outra maneira melhor de fazer isso.
Obrigado aos que leram.
KERPLUNK 15/04/2016 17:28:39
#461012
Resposta escolhida
Eu teria adicionado uma propriedade no objeto [Ô]Pessoa[Ô], que fossem booleana, com um nome tipo [Ô]Deletar[Ô]. Elas apareceriam automaticamente como um checkbox e então simplesmente selecionaria com uma expressão lambda as que estivesse selecionadas:

List<Pessoa> selecionados = ((List<Pessoa>)DataGridView1.DataSource).Where(s => s.Deletar == true);
selectionados.ForEach(f => f.Deletar());


Simples assim. é o que sempre digo, para quem está iniciando em OOP, a maior dificuldade é não confundir exibição de dados com dados em si.
KERPLUNK 15/04/2016 22:15:11
#461017
Na real, dava pra resolver em uma linha de comando só. Ficaria meio comprida, mas daria pra fazer. O caso é a confusão de Grid(representação de dados) com dados em si. Uma vez preenchido, não quer dizer que eu tenho que percorrer o grid. Se eu passei meus dados como DataSource, eles ainda estão no DataSource.
PERCIFILHO 18/04/2016 08:32:49
#461066
Valeu Kerp, sempre é bom aprender. Nunca é demais.
Vou seguir seu conselho.
Obrigado.
Tópico encerrado , respostas não são mais permitidas