Removendo itens de uma List<>

Olá,

estava dando uma vasculhada em uns emails antigos e achei uma mensagem que havia enviado para uma lista de discussão de dot.net sobre como remover itens de uma coleção do tipo List<T>.

Se tentarmos remover um item de uma lista enquanto estivermos iterando sobre a mesma utilizando o foreach, uma exceção será lançada, por exemplo:

private List<string> lista;

lista = new List<string>();

lista.Add(“a”);

lista.Add(“b”);

lista.Add(“c”);

foreach (string s in lista)

lista.Remove(s);

O código acima lançará uma exceção pois estamos removendo um item da coleção enquanto estamos iterando sobre a mesma.

Uma alternativa é utilizar o código abaixo que utiliza o método ForEach da classe List<> e o conceito de delegates. Podemos pensar num delegate como sendo um ponteiro de função:

private List<string> lista;

lista = new List<string>();

lista.Add(“a”);

lista.Add(“b”);

lista.Add(“c”);

lista.ForEach(Action);

}

private void Action(string s)

{

if (s.Equals(“a”))

lista.Remove(s);

}

É possível utilizar ainda um delegate anônimo, aonde não precisaríamos definir o método Action e o código do mesmo seria inserido inline, mas acho que essa solução prejudica a legibilidade, vejamos:

lista.ForEach(delegate(string s) { if (s.Equals(“a”)) ls.Remove(s); });

Vale a pena lembrar que ainda existem, pelo menos, duas formas de se conseguir o mesmo objetivo. Uma utilizando goto, que é altamente condenado, mas que nesse caso não vejo tantos problemas:

laco:

for (int i = 0; i < lista.Count; i++)

{

string s = lista[i];

if (s.Equals(“a”))

{

lista.Remove(s);

goto laco;

}

}

e outra é utilizando for:

for (int i = 0; i < lista.Count; i++)

{

string s = lista[i];

if (s.Equals(“a”))

{

lista.Remove(s);

i–;

}

}

É isso aí. Só quis mais uma vez compartilhar conhecimento. Gostaria de saber de alguém de Java se essas alternativas também se aplicam nessa linguagem.

Abraços e até a próxima!