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!