Join two items from an IList in a single item by the Id

2

In my class it has:

Id 
Venda 
Devolucao

I have IList of this class, and in this IList has

[0] classe Id = 100, Venda = 230.00, Devolucao = 0;
[1] classe Id = 100, Venda = 0, Devolucao = 50.00;
[2] classe Id = 101, Venda = 515.00, Devolucao = 0;
[3] classe Id = 101, Venda = 0, Devolucao = 42.00;

How to merge this information by Id? To stay:

[0] classe Id = 100, Venda = 230.00, Devolucao = 50.00;
[1] classe Id = 101, Venda = 515.00, Devolucao = 42.00;

class VendaDevolucao
{
    public virtual int Id { get; set; }
    public virtual double Venda { get; set; }
    public virtual double Devolucao { get; set; }
}

IList<VendaDevolucao> vendas = new List<VendaDevolucao>();

VendaDevolucao venda1 = new VendaDevolucao();
venda1.Id = 100;
venda1.Venda = 230.00;
venda1.Devolucao = 0;
vendas.Add(venda1);

VendaDevolucao venda2 = new VendaDevolucao();
venda2.Id = 100;
venda2.Venda = 0;
venda2.Devolucao = 50.00;
vendas.Add(venda2);

VendaDevolucao venda3 = new VendaDevolucao();
venda3.Id = 101;
venda3.Venda = 515.00;
venda3.Devolucao = 0;
vendas.Add(venda3);

VendaDevolucao venda4 = new VendaDevolucao();
venda4.Id = 101;
venda4.Venda = 0;
venda4.Devolucao = 42.00;
vendas.Add(venda4);
    
asked by anonymous 08.06.2016 / 22:32

2 answers

2

Make a group with Linq (System.Linq) , use the Id to group and add the values of the other two fields:

Example

var items = vendas.GroupBy(c => c.Id)
      .Select(s => new {
         Id = s.Key,
         Venda = s.Sum(v => v.Venda),
         Devolucao = s.Sum(d => d.Devolucao)
      }).ToList();

Demo

or

var items = vendas.GroupBy(c => c.Id)
      .Select(s => new VendaDevolucao  {
         Id = s.Key,
         Venda = s.Sum(v => v.Venda),
         Devolucao = s.Sum(d => d.Devolucao)
      }).ToList();
    
08.06.2016 / 22:53
2

With LINQ you can do this:

    var junta = vendas.GroupBy(x => x.Id)
        .Select(x => new {
            Id = x.First().Id,
            Venda = x.Sum(v => v.Venda),
            Devolucao = x.Sum(v => v.Devolucao)
        });

See running on dotNetFiddle and on CodingGround .

    
08.06.2016 / 23:00