none
Atribuir valor a propriedade de um objeto por uma lista de objetos RRS feed

  • Pergunta

  • Tenho uma lista de objetos: List. Bem, esse objeto tem três propriedades, digamos, cnpj, acao e novaacao. Fiz um linq ou lambda e me trouxe todos os resultados, digamos duas linhas. Faço um foreach no resultado da linq ou lambda e como agora eu atribuo a cada propriedade do meu objeto através da lista desse objeto? Assim:

    List<pdv> lista = new List<pdv>();
    var resultado = (from ...).ToList();
    
    foreach(var r in resultado)
    {
       lista.Add(r.cnpj);//ISSO DÁ ERRO
    }
    quarta-feira, 28 de maio de 2014 14:06

Respostas

  • Olá Daniel, não gera erro. Só repete o mesmo cnpj. Tipo, eu tenho dois cnpj distintos. A lista realmente está com dois registros ou duas linhas, mas sempre com o mesmo cnpj. Se colocar um break e debugar, vem o primeiro CNPJ, legal. Depois, vem o segundo e toda a lista fica com esse segundo CNPJ. Veja como está meus foreach

    Nesse código, eu consigo ter dois registros, ou seja, a lista tem duas linhas, mas com o mesmo cnpj e eu tenho dois cnpj diferentes.

    foreach (var r in resultadoAcao)
                    {
                        novo.acao = r.acao;
                        novo.proximaAcao = r.proximaacao;
                    }
    
                    foreach (var r in resultadoPdv)
                    {
                        novo.cnpj = r.Cnpj;
                        lista.Add(novo);
                    }

     pnet, isso acontece porque a cada iteração você deve sempre criar uma instancia da classe que deseja adicionar entende ! Vamos supor que seu "novo" seja uma classe chamada Novo veja como ficaria :

    foreach (var r in resultadoPdv)
                    { 
                        Novo novo = new Novo();
                        novo.cnpj = r.Cnpj;
                        lista.Add(novo);
                    }
     Somente fazendo isso não vai mais repetir o cnpj ! Pois na sua lista não vai mais ser apontado para a mesma referencia do objeto !

    • Marcado como Resposta pnet quarta-feira, 28 de maio de 2014 21:28
    quarta-feira, 28 de maio de 2014 16:39

Todas as Respostas

  • Quando você está guardando o CNPJ, (provavelmente é uma string), você está tentando guardar na lista de pdv.

    O correto é você fazer assim:

    List<string> lista = new List<string>();
    var resultado = (from ...).ToList();
    
    foreach(var r in resultado)
    {
       lista.Add(r.cnpj);
    }

    Agora, se você quer usar o objeto que você retornou no linq e quer passar para o tipo pdv, então você deve fazer assim:

    List<pdv> lista = new List<pdv>();
    var resultado = (from ...).ToList();
    
    foreach(var r in resultado)
    {
       pdv obj = new pdv();
       obj.cnpj = r.cnpj;
       obj.acao = r.acao;
       ...
       lista.Add(obj);
    }

    Isso fica meio estranho porque normalmente o primeiro objeto que fazemos já é o modelo utilizado. Mas se o primeiro objeto é somente um objeto de transporte, use dessa forma.

    Veja se funciona e poste seus resultados.

    Abraços !


    Diego Murakami View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.


    • Editado Diego Murakami quarta-feira, 28 de maio de 2014 14:23 adicionei mais códigos
    quarta-feira, 28 de maio de 2014 14:19
  • Não funciona, porque em caso de eu ter dois cnpj, nesse exemplo eu trago apenas um e sempre o último.
    quarta-feira, 28 de maio de 2014 14:37
  • Olá pnet, o que o Diego quis dizer foi como fazer o "DE-PARA" nome que chamamos quando fazemos esse tipo de operação ! A pergunta é quais as propriedades que esse seu objeto tem chamado "pdv" que quando vc atribui o cnpj ele gera o erro !
    quarta-feira, 28 de maio de 2014 14:41
  • Olá Daniel, não gera erro. Só repete o mesmo cnpj. Tipo, eu tenho dois cnpj distintos. A lista realmente está com dois registros ou duas linhas, mas sempre com o mesmo cnpj. Se colocar um break e debugar, vem o primeiro CNPJ, legal. Depois, vem o segundo e toda a lista fica com esse segundo CNPJ. Veja como está meus foreach

    Nesse código, eu consigo ter dois registros, ou seja, a lista tem duas linhas, mas com o mesmo cnpj e eu tenho dois cnpj diferentes.

    foreach (var r in resultadoAcao)
                    {
                        novo.acao = r.acao;
                        novo.proximaAcao = r.proximaacao;
                    }
    
                    foreach (var r in resultadoPdv)
                    {
                        novo.cnpj = r.Cnpj;
                        lista.Add(novo);
                    }

    quarta-feira, 28 de maio de 2014 15:01
  • Veja como fica o xml de retorno do web service

    <ArrayOfPdvNovo xmlns="http://schemas.datacontract.org/2004/07/V99SuporteTecnicoContracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <PdvNovo>
    <acao>Visita Técnica</acao>
    <cnpj>03146478000112</cnpj>
    <proximaAcao>Agendamento de Visita Técnica Parceiro</proximaAcao>
    </PdvNovo>
    <PdvNovo>
    <acao>Visita Técnica</acao>
    <cnpj>03146478000112</cnpj>
    <proximaAcao>Agendamento de Visita Técnica Parceiro</proximaAcao>
    </PdvNovo>
    </ArrayOfPdvNovo>

    quarta-feira, 28 de maio de 2014 15:03
  • pnet,

    A sua idéia é guardar objetos de pdv sem repetir CNPJ ?

    Se não, fale qual é o problema que você precisa resolver que a gente ajuda.

    Abraços !


    Diego Murakami View Diego Murakami's LinkedIn profile - MCP, MS
    * Por favor "Marcar como Resposta" caso esta for útil para sua dúvida.

    quarta-feira, 28 de maio de 2014 15:12
  • Olá Daniel, não gera erro. Só repete o mesmo cnpj. Tipo, eu tenho dois cnpj distintos. A lista realmente está com dois registros ou duas linhas, mas sempre com o mesmo cnpj. Se colocar um break e debugar, vem o primeiro CNPJ, legal. Depois, vem o segundo e toda a lista fica com esse segundo CNPJ. Veja como está meus foreach

    Nesse código, eu consigo ter dois registros, ou seja, a lista tem duas linhas, mas com o mesmo cnpj e eu tenho dois cnpj diferentes.

    foreach (var r in resultadoAcao)
                    {
                        novo.acao = r.acao;
                        novo.proximaAcao = r.proximaacao;
                    }
    
                    foreach (var r in resultadoPdv)
                    {
                        novo.cnpj = r.Cnpj;
                        lista.Add(novo);
                    }

     pnet, isso acontece porque a cada iteração você deve sempre criar uma instancia da classe que deseja adicionar entende ! Vamos supor que seu "novo" seja uma classe chamada Novo veja como ficaria :

    foreach (var r in resultadoPdv)
                    { 
                        Novo novo = new Novo();
                        novo.cnpj = r.Cnpj;
                        lista.Add(novo);
                    }
     Somente fazendo isso não vai mais repetir o cnpj ! Pois na sua lista não vai mais ser apontado para a mesma referencia do objeto !

    • Marcado como Resposta pnet quarta-feira, 28 de maio de 2014 21:28
    quarta-feira, 28 de maio de 2014 16:39