none
Lidando com listas ou dicionários RRS feed

  • Pergunta

  • Pessoal, boa noite. Estou com uma dúvida.

    Tenho produtos e quantidades, ex.:

    Produto 1 - 20
    Produto 2 - 15
    Produto 3 - 10
    Produto 1 - 15

    Ele me retorna do banco como "idProduto" e "quantidade", ex.:
    Linha 1 idProduto = 1, quantidade 20
    Linha 2 idPorudot = 2, quantidade 15

    Eu preciso juntar tudo por idProduto... por exemplo o idProduto 1 tem que ser 35. E aí estou com um problema pois não sei como fazer isso, tentei adicionar um dicionário com o idProduto como "KEY" e a quantidade como "value".. Mas depois não consigo atualziar, ex:

    List<Pedido> TodosPedidos = Pedidos.BuscaTodas(dia); MultiDimDictList myDicList = new MultiDimDictList(); for (int i = 0; i < TodosPedidos.Count; i++) { foreach (var item in TodosPedidos[i].PedidoItems) { if (myDicList.Count == 0) { myDicList.Add(item.idProduto.ToString(), item.quantidade); } else { foreach (var key in myDicList) { if (key.Key == item.idProduto.ToString()) { } else { myDicList.Add(item.idProduto.ToString(), item.quantidade); } } } } }

     public class MultiDimDictList: Dictionary<string, int>{ 
        
        }


    Tentei inserir no dicionário myDicList um item com o "key" o idProduto e o value a quantidade.
    Mas quando rodo de novo, ele dizia que já existia um "key" 1 por exemplo

    Como verificar se o key já existe, e se existir, alterar o value..
    ou
    Eu estou fazendo da melhor forma?

    Obrigado

    sexta-feira, 23 de março de 2012 04:36

Respostas

  • Cara... usando um poco de linq resolvi pra vc... ve ai... to meio com sono entao acho q da pra melhor... mas vai ai

        public class produto
        {
            public int qtd { get; set; }
            public string nome { get; set; }
        }

            protected void Page_Load(object sender, EventArgs e)
            {
                IList<produto> produtos = new List<produto>();
                IList<produto> saida = new List<produto>();

                produtos.Add(new produto { nome = "produto1", qtd = 1 });
                produtos.Add(new produto { nome = "produto2", qtd = 1 });
                produtos.Add(new produto { nome = "produto1", qtd = 1 });


                foreach (produto p in produtos)
                {
                    if (saida.Where(i => i.nome == p.nome).Count() <= 0)
                    {
                        saida.Add(new produto{ nome = p.nome, qtd = produtos.Where(x => x.nome == p.nome).Sum(i => i.qtd)});
                    }
                }
            }

    Ve ai se consegui te ajudar...


    Guns!

    sexta-feira, 23 de março de 2012 05:10
  • tente assim:

    saida = saida.orderby( x => x.nome ).ToList();


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)

    sexta-feira, 23 de março de 2012 14:21
    Moderador
  • Tenta isso que o Olavo comentou queda certo sim =)

    Esse x i não é padrao... é uma forma de acessar os atributos de uma lista de objetos com LINQ... pesquisa um pouco sobre linq ai que vale a pena em algumas situações


    Guns!

    segunda-feira, 26 de março de 2012 17:39

Todas as Respostas

  • Cara... usando um poco de linq resolvi pra vc... ve ai... to meio com sono entao acho q da pra melhor... mas vai ai

        public class produto
        {
            public int qtd { get; set; }
            public string nome { get; set; }
        }

            protected void Page_Load(object sender, EventArgs e)
            {
                IList<produto> produtos = new List<produto>();
                IList<produto> saida = new List<produto>();

                produtos.Add(new produto { nome = "produto1", qtd = 1 });
                produtos.Add(new produto { nome = "produto2", qtd = 1 });
                produtos.Add(new produto { nome = "produto1", qtd = 1 });


                foreach (produto p in produtos)
                {
                    if (saida.Where(i => i.nome == p.nome).Count() <= 0)
                    {
                        saida.Add(new produto{ nome = p.nome, qtd = produtos.Where(x => x.nome == p.nome).Sum(i => i.qtd)});
                    }
                }
            }

    Ve ai se consegui te ajudar...


    Guns!

    sexta-feira, 23 de março de 2012 05:10
  • Cara, muito obrigado deu certo.

    Agora não entendi muito bem. O que é esses "i" e "x" ??? 

    Seguindo sua lógico eu tentei ordenar pelo ID também, e coloquei o final.

    saida.orderby( x => x.nome );
    Mas ele não ordenou...
    Pq?

    No mais, obrigado por tudo, valeu.

    sexta-feira, 23 de março de 2012 14:16
  • tente assim:

    saida = saida.orderby( x => x.nome ).ToList();


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)

    sexta-feira, 23 de março de 2012 14:21
    Moderador
  • Tenta isso que o Olavo comentou queda certo sim =)

    Esse x i não é padrao... é uma forma de acessar os atributos de uma lista de objetos com LINQ... pesquisa um pouco sobre linq ai que vale a pena em algumas situações


    Guns!

    segunda-feira, 26 de março de 2012 17:39
  • Valeuuu!
    terça-feira, 27 de março de 2012 20:40