none
Comparando os valores de 2 colunas numa List<string> e excluindo os registros duplicados RRS feed

  • Pergunta

  • Pessoal, boa noite, prestem bastante atenção na seguinte situação:

    for (int i = 1; i < linhas.Count; i++)
      {
         string[] valoresTabulados = linhas[i].Split('\t');
      }

    Agora preciso verificar os valores da coluna 1 e 5 de valoresTabulados, com todo o resto da lista(valoresTabulados).... se algum item da lista tiver os mesmos valores, eu excluo a linha da lista.

    Basicamente, como excluir itens duplicados de uma lista, comparando apenas 2 colunas?


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    quarta-feira, 10 de abril de 2013 23:54

Respostas

  • Obrigado pelas respostas, mas  eu consegui resolver assim:

    for (int i = 0; i < linhasValidas.Count; i++)
                            {
    
                                string[] valoresTabulados_1 = linhasValidas[i].Split('\t');
                                string valor_1 = valoresTabulados_1[colunaCampaign];
                                string valor_2 = valoresTabulados_1[colunaLink];
    
    
                                for (int k = 0; k < linhasValidas.Count; k++)
                                {
                                    if (k <= i)
                                        continue;
    
                                    string[] valoresTabulados_2 = linhasValidas[k].Split('\t');
                                    string valor_1_2 = valoresTabulados_2[colunaCampaign];
                                    string valor_2_2 = valoresTabulados_2[colunaLink];
    
    
    
                                    if (valor_1 == valor_1_2 && valor_2 == valor_2_2)
                                    {
                                        registroDuplicado = true;
                                    }
    
                                    if (registroDuplicado == true)
                                    {
                                        if (!indicesDuplicados.Contains(k))
                                        {
                                            indicesDuplicados.Add(k);
    
                                        }
    
                                        registroDuplicado = false;
                                    }
                                }
                            }
    
                            
                            //List<string> linhasDuplicadas = new List<string>();
                            foreach (var item in indicesDuplicados)
                            {
                                linhasValidas[item] = "";
                            }
    
                            for (int i = linhasValidas.Count - 1; i >= 0; i--)
                            {
    
                                if (linhasValidas[i] == "")
                                {
                                    linhasValidas.RemoveAt(i);
    
                                    cbTemplates.Text = templateEscolhido;
                                }
                            }


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    • Marcado como Resposta Tianodraco sexta-feira, 12 de abril de 2013 11:50
    sexta-feira, 12 de abril de 2013 11:50

Todas as Respostas

  • Faça o seguinte...

    List<string> linhas2 = new List<string>();
    
    for (int i = 1; i < linhas.Count; i++)
    {
       string[] valoresTabulados = linhas[i].Split('\t');
    
       if (valoresTabulados[0]!=valoresTabulados[4])
          linhas2.Add(linhas[i]);
        
       
    }
    
    

    Desta forma o linhas2 somente terá linhas onde col1 != da col5

    Abraço!!!


    (Se a isto ajudou a resolver o problema, por favor, marque como resposta)

    quinta-feira, 11 de abril de 2013 00:25
  • Oh, amigo, desculpe, mas não expliquei direito...

    Eu tenho q checar linha por linha:

    col 1 ----  col 5  -> linha 1

    checando linha 2:

    col 1 ---- col 5  

    se col1 da linha 2 = col1 da linha 1   e  se   col5 da linha 2 = col5 da linha 1.....

    Não processa a linha 2....

    Eu quero excluir todas as linhas da minha list comparando as col1 e col5 de suas respectivas linhas com as outras linhas da list, e não a col1 e col 5 da mesma linha...


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    quinta-feira, 11 de abril de 2013 00:49
  • A comparação será sempre entre a linha n e a linha n+1?

    ou terás que comparar linha 1 com linha 2, linha 1 com linha 3, linha 1 com linha n?

    Se for somente comparar linha n com linha n+1, então tente o código abaixo..

     List<string> linhasProcessadas = new List<string>();
                // Adiciona a primeira linha ao resultado
                linhasProcessadas.Add(linhasOriginal[0]);
                for (int i = 1; i < linhasOriginal.Count; i++)
                {
                    string[] l1 = linhasOriginal[i - 1].Split('\t');
                    string[] l2 = linhasProcessadas[i].Split('\t');
                    if ((l1[1] != l2[1]) || (l1[5] != l2[5]))
                        linhasProcessadas.Add(linhasOriginal[i]);
                }

    Abraço!!!


    (Se a isto ajudou a resolver o problema, por favor, marque como resposta)


    quinta-feira, 11 de abril de 2013 14:06
  • Obrigado pelas respostas, mas  eu consegui resolver assim:

    for (int i = 0; i < linhasValidas.Count; i++)
                            {
    
                                string[] valoresTabulados_1 = linhasValidas[i].Split('\t');
                                string valor_1 = valoresTabulados_1[colunaCampaign];
                                string valor_2 = valoresTabulados_1[colunaLink];
    
    
                                for (int k = 0; k < linhasValidas.Count; k++)
                                {
                                    if (k <= i)
                                        continue;
    
                                    string[] valoresTabulados_2 = linhasValidas[k].Split('\t');
                                    string valor_1_2 = valoresTabulados_2[colunaCampaign];
                                    string valor_2_2 = valoresTabulados_2[colunaLink];
    
    
    
                                    if (valor_1 == valor_1_2 && valor_2 == valor_2_2)
                                    {
                                        registroDuplicado = true;
                                    }
    
                                    if (registroDuplicado == true)
                                    {
                                        if (!indicesDuplicados.Contains(k))
                                        {
                                            indicesDuplicados.Add(k);
    
                                        }
    
                                        registroDuplicado = false;
                                    }
                                }
                            }
    
                            
                            //List<string> linhasDuplicadas = new List<string>();
                            foreach (var item in indicesDuplicados)
                            {
                                linhasValidas[item] = "";
                            }
    
                            for (int i = linhasValidas.Count - 1; i >= 0; i--)
                            {
    
                                if (linhasValidas[i] == "")
                                {
                                    linhasValidas.RemoveAt(i);
    
                                    cbTemplates.Text = templateEscolhido;
                                }
                            }


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.

    • Marcado como Resposta Tianodraco sexta-feira, 12 de abril de 2013 11:50
    sexta-feira, 12 de abril de 2013 11:50