.NET: Deletar itens de uma coleção durante uma iteração (for, foreach) – C# & VB.NET

As vezes, precisamos percorrer uma determinada coleção fazendo verificações (Através de blocos if, por exemplo), removendo itens que não se enquadram em uma determinada regra. Contudo, não podemos modificar uma coleção de dentro de um laço foreach (For Each no VB), e também teremos problemas ao fazer isso de dentro de uma laço for (For) que esteja percorrendo uma coleção.

E a solução? Mais simples do que se pode imaginar! Ao invés de usar um foreach ou um for comum para percorrer a coleção, você usa um for reverso.

Segue o exemplo:

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace HL
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<string> Items = new List<string>(new string[]{"Herbert", "Lausmann", "é", "o", "cara", "!"});
            
            for(int i = (Items.Count - 1); i >= 0; --i)
            {
                if(Items[i].Contains('a'))
                {
                    Items.RemoveAt(i);
                }
            }
            
            foreach(string str in Items) Console.WriteLine(str);
            Console.ReadKey();
        }
    }
}

VB.NET:

Imports System.Collections.Generic
Imports System.Linq
Imports System.Text.RegularExpressions

Namespace HL
	Public Class Program
		Public Shared Sub Main()
			Dim Items As New List(Of String)(New String() {"Herbert", "Lausmann", "é", "o", "cara", "!"})

			For i As Integer = (Items.Count - 1) To 0 Step -1
				If Items(i).Contains("a"C) Then
					Items.RemoveAt(i)
				End If
			Next

			For Each str As String In Items
				Console.WriteLine(str)
			Next
			Console.ReadKey()
		End Sub
	End Class
End Namespace

😉

Anúncios

3 comentários

  1. Bem pensado. Sabe como eu sempre fiz?
    nesse trecho:
    Items.RemoveAt(i)
    eu fazia um replace trocando o caracter por um espaço ” ” e depois de percorrer toda a string eu dava um replace removendo os espaços aushauhsuahsuhas gambiarra da peste!

    1. hauehauehaue. Eu fazia uma parada pior! As vezes quando tinha que remover vários items d uma coleção, eu percorria com um foreach criando outra coleção com os items pra remover. Ai eu percorria essa outra coleção removendo os items da coleção original =S kkkkkkkkk

Deixe um comentário :)

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s