Ir ao conteúdo
  • Cadastre-se
Marcelo Ferraz Bueno

C# Listas de Classe como somar

Posts recomendados

Boa tarde a todos,

 

Estou desenvolvendo um código que lê um arquivo txt com diversas informações e preciso que ele me dê a quantidade de um determinado produto. O programa faz a leitura e acrescenta as informações a uma lista e exibe na tela as informações do txt da maneira que quero, mas eu queria que quando o número do pedido e o código do produto fossem iguais ele somasse a quantidade do produto e retornasse na tela apenas uma linha com o total.

 

O programa foi desenvolvido da seguinte forma.

 

Classe.

class Recjun
    {
        /*  1 = 588382;	    - Pedido	Double
            2 = 01038306;	- Serie		Double
            3 = 003;	    - Filial	Int
            4 = 09;		    - Terminal	Int
            5 = 1315;	    - Produto	Int
            6 = 2309;	    - Calculo	Int
            7 = 0001,000;	- Quantidade	Double
            8 = 000,166;    - Quebra	Double
            9 = 020;	    - Ind1		Int
            10 = CX;	    - Tipo		String
            11 = 190925;    - Data		Double
            12 = 0914;	    - Hora		Int
            13 =  ;		    - Nulo		String
            14 = E;		    - Ope1		String
            15 = E;		    - Ope2		String
            16 = 000017	    - Ind2		Double  */

        public double Pedido, Serie, Quantidade, Quebra, Data, Ind2;
        public int Filial, Terminal, Produto, Calculo, Ind1, Hora, Resultado;
        public string Tipo, Nulo, Ope1, Ope2;

        public Recjun()
        {
        }

        public Recjun(double pedido, double serie, int filial, int terminal, int produto, int calculo, double quantidade, double quebra, int ind1, string tipo, double data, int hora, string nulo, string ope1, string ope2, double ind2)
        {
            Pedido = pedido;
            Serie = serie;
            Filial = filial;
            Terminal = terminal;
            Produto = produto;
            Calculo = calculo;
            Quantidade = quantidade;
            Quebra = quebra;
            Ind1 = ind1;
            Tipo = tipo;
            Data = data;
            Hora = hora;
            Nulo = nulo;
            Ope1 = ope1;
            Ope2 = ope2;
            Ind2 = ind2;
        }
        public override string ToString()
        {
            return Pedido + ", " + Produto + ", " + Quantidade + ", " + Tipo + ".".ToString();
        }
    }

Programa:

using System;
using System.IO;
using System.Collections.Generic;

namespace Testes_Repeticao
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Recjun> List = new List<Recjun>();

            Recjun rec = new Recjun();

            StreamReader stream = new StreamReader("C:/RECJUN.TXT");

            string produtoslidos;
            int contador = 0;

            while ((produtoslidos = stream.ReadLine()) != null)
            {
                contador++;
            }

            StreamReader stream2 = new StreamReader("C:/RECJUN.TXT");


            while ((produtoslidos = stream2.ReadLine()) != null)
            {
                string[] recjun = produtoslidos.Split(';');
                string spedido = recjun[0];
                string sserie = recjun[1];
                string sfilial = recjun[2];
                string sterminal = recjun[3];
                string sproduto = recjun[4];
                string scalculo = recjun[5];
                string squantidade = recjun[6];
                string squebra = recjun[7];
                string sind1 = recjun[8];
                string stipo = recjun[9];
                string sdata = recjun[10];
                string shora = recjun[11];
                string snulo = recjun[12];
                string sope1 = recjun[13];
                string sope2 = recjun[14];
                string sind2 = recjun[15];

                Recjun[] Vect = new Recjun[contador];
                rec.Pedido = int.Parse(spedido);
                rec.Serie = double.Parse(sserie);
                rec.Filial = int.Parse(sfilial);
                rec.Terminal = int.Parse(sterminal);
                rec.Produto = int.Parse(sproduto);
                rec.Calculo = int.Parse(scalculo);
                rec.Quantidade = double.Parse(squantidade);
                rec.Quebra = double.Parse(squebra);
                rec.Ind1 = int.Parse(sind1);
                rec.Tipo = stipo;
                rec.Data = double.Parse(sdata);
                rec.Hora = int.Parse(shora);
                rec.Nulo = snulo;
                rec.Ope1 = sope1;
                rec.Ope2 = sope2;
                rec.Ind2 = double.Parse(sind2);

                List.Add(new Recjun(rec.Pedido, rec.Serie, rec.Filial, rec.Terminal, rec.Produto,
                    rec.Calculo, rec.Quantidade, rec.Quebra, rec.Ind1, rec.Tipo, rec.Data,
                    rec.Hora, rec.Nulo, rec.Ope1, rec.Ope2, rec.Ind2));
            }
            foreach (Recjun obj in List)
            {
                Console.WriteLine(obj);
            }
        }
    }
}

O arquivo que ele lê é esse:

588382;01038306;003;09;1315;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000017
588382;01038308;003;09;1315;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000017
588382;01185286;003;09;1315;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000001
588382;01182466;003;09;1316;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000007
588382;01182478;003;09;1316;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000007
588382;01182479;003;09;1316;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000007
588382;01184506;003;09;1317;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000013
588382;01184510;003;09;1317;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000013
588382;01184517;003;09;1317;2309;0001,000;000,166;020;CX;190925;0914; ;E;E;000013

E o resultado que ele retorna na tela é esse:

588382, 1315, 1, CX.
588382, 1315, 1, CX.
588382, 1315, 1, CX.
588382, 1316, 1, CX.
588382, 1316, 1, CX.
588382, 1316, 1, CX.
588382, 1317, 1, CX.
588382, 1317, 1, CX.
588382, 1317, 1, CX

 

Como posso fazer para que o resultado exibido seja como o a seguir ?

 

588382, 1315, 3, CX.
588382, 1316, 3, CX.
588382, 1317, 3, CX.

 

Agradeço desde já a ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites
List<Recjun> List = new List<Recjun>();

A variável está com o mesmo nome do tipo, aconselho a mudar.

De todo modo, o que você tem que fazer é, antes de adicionar, procurar se o produto de um determinado código já existe na lista:

Recjun resultado = Lista.Find (delegate(Recjun rec2) {return rec2.Produto == rec.Pedido;}); //procura se o produto ja foi cadastrado
if (resultado != null) resultado.Quantidade+=rec.Quantidade; // se ja foi, apenas incrementa a quantidade
else Lista.Add(rec); //caso contrario, cadastra novo produto

Não testei o código acima, mas o p princípio é esse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza Obrigado pela ajuda, eu testei mas não deu certo. Seguindo a sua linha de pensamento modifiquei da seguinte maneira:

 

Recjun ped = Lista.Find(x => x.Pedido == int.Parse(spedido));

                if (ped != null)
                {
                    Recjun prod = Lista.Find(x => x.Produto == int.Parse(sproduto));

                    if (prod != null)
                    {
                        double prod2 = double.Parse(squantidade);

                        prod.Quantidade += prod2;
                    }
                    else
                    {
                        Lista.Add(new Recjun(rec.Pedido, rec.Produto, rec.Quantidade, rec.Tipo));

                    }
                }
                else
                {
                    Lista.Add(new Recjun(rec.Pedido, rec.Produto, rec.Quantidade, rec.Tipo));
                }

Dessa maneira consegui chegar no resultado que queria. Muito obrigado pela sua ajuda.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Flávio Pedroza Tive um outro problema com esse código, será que você pode me ajudar ? O resultado tinha dado certo porque no arquivo lido não tinha um produto repetido.

 

Por exemplo, tenho dois números de pedido e em ambos ele contem o mesmo produto, ao invés de o programa somar apenas os produtos do pedido atual ele soma todos a primeira ocorrência do produto deixando o segundo pedido zerado. Como eu poderia fazer para ele somar apenas os produtos do mesmo pedido ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se entendi bem, você tem que adicionar outra condicional na procura: além de ter o mesmo código, os produtos tem que estar no mesmo pedido:

Recjun prod = Lista.Find(x => ((x.Produto == int.Parse(sproduto)) && (x.Pedido == int.Parse(spedido))));

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...