none
Como remover itens de uma lista ? RRS feed

  • Pergunta

  • Como posso remover itens de uma lista sem  que aconteça um break ?

    Possuo uma lista que é carregada com dados vindo do banco de dados.

    Em seguida realizo alguns calculos e quero me livrar dos valores que estão nesta lista que não satisfaçam uma condição.

    olhei esse topico http://stackoverflow.com/questions/832165/net-remove-from-a-listt-within-a-foreach-loop

    porém ainda sou bem iniciante em progamação  ....

      for (int i = 0; i < listaOcorrencia.Count ; i++)
    {      
                    
       if ( condição ????????????????)
       {
           listaOcorrencia.RemoveAt(i);
           i--;

    }

    Não sei como fazer uma condição  para um certo item da lista, que quero remover ....

    No caso carreguei  a lista com dados do banco assim.

    ocorrencia.Sumario = rowReader.GetNullableString("RESUMO");

    E gostaria de utilizar o FOR para  remover os itens que  a condição

    ocorrencia.Sumario == "Inicio de fase"

    Obrigado pela ajuda;

    segunda-feira, 23 de setembro de 2013 20:28

Respostas

  • Se pode fazer seguindo sua lógica

    List<int> removeLista = new List<int>();
    for (int i = 0; i < listaOcorrencia.Count ; i++)
    {      
                    
       if ( condição ????????????????)
       {
           removeLista.Add(i);
       }
    }

    Crie uma variavel que vai conter o que se vai excluir, primeiro se procura depois você exclui 

    Ai faça o novo for logo abaixo

    for (int i = 0; i < removeLista.Count ; i++)
    {                     
      
       listaOcorrencia.RemoveAt(removeLista[i]);   
    
    }

    Obs: Dentro do for "Nunca coloque incrementador ou decrementador, porque o for faz isso para você!


    Fúlvio Cezar Canducci Dias

    segunda-feira, 23 de setembro de 2013 23:58

Todas as Respostas

  • Marcelo, para começar vamos mudar o for para que não o loop não se perca... Tente isso

    for (int i = listaOcorrencia.Count ; i >= 0 ; i--) {

      if ( ocorrencia.Sumario == "Inicio de fase")
       {
           listaOcorrencia.RemoveAt(i);

       }}

    segunda-feira, 23 de setembro de 2013 20:33
  •    public class ItemQualquer
        {
            public int Id { get; set; }

            public string Nome { get; set; }
        }

                List<ItemQualquer> lista = new List<ItemQualquer>();
                lista.Add(new ItemQualquer() {Id = 1, Nome = "Valor1" });
                lista.Add(new ItemQualquer() { Id = 2, Nome = "Valor2" });
                lista.Add(new ItemQualquer() { Id = 3, Nome = "Valor1" });
                lista.Add(new ItemQualquer() { Id = 4, Nome = "Valor1" });

                int quantidadeRemovido = lista.RemoveAll(item => item.Id != 1 && item.Nome == "Valor1");


    • Sugerido como Resposta Gabrielr12t sexta-feira, 21 de dezembro de 2018 04:08
    segunda-feira, 23 de setembro de 2013 20:40
  • Cristian.

    Obrigado pelo resposta.

    O que ocorre ,quando utilizo esse for

    for (int i = listaOcorrencia.Count ; i >= 0 ; i--) {

      if ( ocorrencia.Sumario == "Inicio de fase")
       {
           listaOcorrencia.RemoveAt(i);

       }}

    Ele não encontra a referencia "ocorrencia", porque eu não instância. Se eu instânciar ele zera as variaveis carregadas com o metodo abaixo: 

     private static List<Ocorrencia> ConstruirListaOcorrencias(DataTable dataTable)
            {
                List<Ocorrencia> lista = new List<Ocorrencia>();
                foreach (DataRow row in dataTable.Rows)
                {
                    NullableDataRowReader rowReader = new NullableDataRowReader(row);
                    Ocorrencia ocorrencia = new Ocorrencia();
                    ocorrencia.Referencia = rowReader.GetNullableString("REFERENCIA");
                    ocorrencia.Id = rowReader.GetNullableString("REQ_ID");
                    ocorrencia.Sumario = rowReader.GetNullableString("RESUMO");
                    ocorrencia.Descricao = rowReader.GetNullableString("DESCRICAO");
                    ocorrencia.Data_Abertura = rowReader.GetNullableDateTime("DT_ABERTURA");
                    ocorrencia.Data_Fechamento = rowReader.GetNullableDateTime("DT_FECHAMENTO");
                    ocorrencia.Data_Resolucao = rowReader.GetNullableDateTime("DT_RESOLVIDO");
                    ocorrencia.Status_Ocorrencia = Status.ConvertCodeToStatus(TipoTicket.Ocorrencia, rowReader.GetString("STATUS_CODE"), rowReader.GetString("STATUS_NAME"));
                    ocorrencia.Nome_Categoria = rowReader.GetNullableString("CATEGORIA");
                    ocorrencia.StatusNome = rowReader.GetNullableString("STATUS_NAME");
                    //Ocorrencia.TipoOcorrencia.
                    if (rowReader.Row.Table.Columns.Contains("TIPO"))
                        ocorrencia.Tipo_RRDM = rowReader.GetNullableString("TIPO");
                    lista.Add(ocorrencia);
                }
                return lista;

    Com o metodo:

      #region Contabiliza os atendimentos por analista - Relatorio Detalhado
            public static void MontaAtendimentoDetalhado(List<Ocorrencia> listaOcorrencia, DateTime dtInicio, DateTime dtFim, List<string> listaMatriculas, List<Analista> listaAnalista)
            {
                DateTime? dtInicial;
                TipoStatusOcorrencia tipoStatus;
                string Atendeu;
                string MatriculaAtendeu;
                TimeSpan spent;
                foreach (Analista analista in listaAnalista)
                {
                    foreach (Ocorrencia ocorrencia in listaOcorrencia)
                    { ... verificações .......

    colei um pequeno trecho.

     Queria após fazer essas verificações que carregam outras lista, eliminar o que não for na condição , if ( ocorrencia.Sumario == "Inicio de fase")... Porém da o erro de remoção em tempo de execução do foreach...

    Estou bem perdido, sei pouco de programação e jogaram esse problema nas minhas costas ....

    Valeu.

    segunda-feira, 23 de setembro de 2013 21:33
  • Fiz um exemplo aí, não sei se entendi o que vc tá querendo, mas veja se funciona.

    List<string> list = new List<string>(); list.Add("ITEM 1"); list.Add("ITEM 2"); list.Add("ITEM 3"); list.Add("ITEM 4"); list.Add("ITEM 5"); for (int i = 0; i < list.Count; i++) { if (list[i] == "ITEM 1") { list.RemoveAt(i); }


    segunda-feira, 23 de setembro de 2013 23:02
  • Se pode fazer seguindo sua lógica

    List<int> removeLista = new List<int>();
    for (int i = 0; i < listaOcorrencia.Count ; i++)
    {      
                    
       if ( condição ????????????????)
       {
           removeLista.Add(i);
       }
    }

    Crie uma variavel que vai conter o que se vai excluir, primeiro se procura depois você exclui 

    Ai faça o novo for logo abaixo

    for (int i = 0; i < removeLista.Count ; i++)
    {                     
      
       listaOcorrencia.RemoveAt(removeLista[i]);   
    
    }

    Obs: Dentro do for "Nunca coloque incrementador ou decrementador, porque o for faz isso para você!


    Fúlvio Cezar Canducci Dias

    segunda-feira, 23 de setembro de 2013 23:58
  • caramba estava procurando essa expressão, já tinha usado em js mas não sabia como era em C#, me ajudou bastante valew
    sexta-feira, 21 de dezembro de 2018 04:07